3box
Version:
Interact with user data
162 lines (145 loc) • 10.7 MB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define("Box", [], factory);
else if(typeof exports === 'object')
exports["Box"] = factory();
else
root["Box"] = factory();
})(window, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/3box.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./node_modules/3box-orbitdb-plugins/src/index.js":
/*!********************************************************!*\
!*** ./node_modules/3box-orbitdb-plugins/src/index.js ***!
\********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("const OdbIdentityProvider = __webpack_require__(/*! ./odbIdentityProvider */ \"./node_modules/3box-orbitdb-plugins/src/odbIdentityProvider.js\")\nconst ModeratorAccessController = __webpack_require__(/*! ./moderatorAccessController */ \"./node_modules/3box-orbitdb-plugins/src/moderatorAccessController.js\")\nconst ThreadAccessController = __webpack_require__(/*! ./threadAccessController */ \"./node_modules/3box-orbitdb-plugins/src/threadAccessController.js\")\nconst LegacyIPFS3BoxAccessController = __webpack_require__(/*! ./legacyIpfs3boxAccessController */ \"./node_modules/3box-orbitdb-plugins/src/legacyIpfs3boxAccessController.js\")\n\nmodule.exports = { OdbIdentityProvider, ModeratorAccessController, ThreadAccessController, LegacyIPFS3BoxAccessController }\n\n\n//# sourceURL=webpack://Box/./node_modules/3box-orbitdb-plugins/src/index.js?");
/***/ }),
/***/ "./node_modules/3box-orbitdb-plugins/src/legacyIpfs3boxAccessController.js":
/*!*********************************************************************************!*\
!*** ./node_modules/3box-orbitdb-plugins/src/legacyIpfs3boxAccessController.js ***!
\*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("const io = __webpack_require__(/*! orbit-db-io */ \"./node_modules/orbit-db-io/index.js\")\nconst Buffer = __webpack_require__(/*! safe-buffer */ \"./node_modules/safe-buffer/index.js\").Buffer\n//const AccessController = require('./access-controller-interface')\nconst type = 'legacy-ipfs-3box'\n\nclass LegacyIPFS3BoxAccessController {\n constructor (ipfs, options) {\n //super()\n this._ipfs = ipfs\n this._write = Array.from(options.write || [])\n this._resolver = options.resolver\n }\n\n // Returns the type of the access controller\n static get type () { return type }\n\n // Return a Set of keys that have `access` capability\n get write () {\n return this._write\n }\n\n async canAppend (entry, identityProvider) {\n // Allow if access list contain the writer's publicKey or is '*'\n const publicKey = entry.v === 0 ? entry.key : await this._publicKeyFromDID(entry.identity.id)\n if (this.write.includes(publicKey) ||\n this.write.includes('*')) {\n return entry.v === 0 ? true : await identityProvider.verifyIdentity(entry.identity)\n }\n return false\n }\n\n async load (address) {\n // Transform '/ipfs/QmPFtHi3cmfZerxtH9ySLdzpg1yFhocYDZgEZywdUXHxFU'\n // to 'QmPFtHi3cmfZerxtH9ySLdzpg1yFhocYDZgEZywdUXHxFU'\n if (address.indexOf('/ipfs') === 0) { address = address.split('/')[2] }\n\n try {\n const access = await io.read(this._ipfs, address)\n this._write = access.write\n } catch (e) {\n console.log('LegacyIPFS3BoxAccessController.load ERROR:', e)\n }\n }\n\n async save (options) {\n let cid\n const access = { admin: [], write: this.write, read: [] }\n try {\n cid = await io.write(this._ipfs, 'raw', Buffer.from(JSON.stringify(access, null, 2)), { format: 'dag-pb'})\n\n } catch (e) {\n console.log('LegacyIPFS3BoxAccessController.save ERROR:', e)\n }\n // return the manifest data\n return { address: cid, skipManifest: true }\n }\n\n static async create (orbitdb, options = {}) {\n options = { ...options, ...{ write: options.write || [orbitdb.identity.publicKey] } }\n return new LegacyIPFS3BoxAccessController(orbitdb._ipfs, options)\n }\n\n async _publicKeyFromDID (did) {\n // TODO - this should look at authentication keys and get publicKey from that\n const doc = await this._resolver.resolve(did)\n return doc.publicKey.find(entry => {\n const id = entry.id.split('#')\n return id[0] === doc.id &&\n (id[1] === 'subSigningKey' || id[1] === 'signingKey')\n }).publicKeyHex\n }\n}\n\nmodule.exports = LegacyIPFS3BoxAccessController\n\n\n//# sourceURL=webpack://Box/./node_modules/3box-orbitdb-plugins/src/legacyIpfs3boxAccessController.js?");
/***/ }),
/***/ "./node_modules/3box-orbitdb-plugins/src/moderatorAccessController.js":
/*!****************************************************************************!*\
!*** ./node_modules/3box-orbitdb-plugins/src/moderatorAccessController.js ***!
\****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("const type = 'moderator-access'\n\nconst MODERATOR = 'MODERATOR'\nconst MEMBER = 'MEMBER'\n\nclass ModeratorAccessController {\n constructor (firstModerator, options) {\n this._capabilityTypes = [MODERATOR]\n this._write = [] // Allowed to add other mods or members\n this._firstModerator = firstModerator\n this._write.push(this._firstModerator)\n this._members = Boolean(options.members)\n if (this._members) this._capabilityTypes.push(MEMBER)\n this._encKeyId = options.encKeyId\n }\n\n static get type () { return type }\n\n isMod(id) {\n return this._write.includes(id)\n }\n\n isValidCapability (capability) {\n return this._capabilityTypes.includes(capability)\n }\n\n get firstModerator () {\n return this._firstModerator\n }\n\n async canAppend (entry, identityProvider) {\n const entryID = entry.identity.id\n const capability = entry.payload.value.capability\n const idAdd = entry.payload.value.id\n const isMod = this.isMod(entryID)\n const validCapability = this.isValidCapability(capability)\n const validSig = async () => identityProvider.verifyIdentity(entry.identity)\n if (isMod && validCapability && (await validSig())) {\n if (capability === MODERATOR) {\n if (idAdd === this.firstModerator) return true\n this._write.push(idAdd)\n }\n return true\n }\n\n return false\n }\n\n async load (address) {\n const addList = address.split('/')\n const suffix = addList.pop()\n this._members = suffix === 'members'\n const mod = suffix.includes('mod') ? suffix : addList.pop()\n this._firstModerator = mod.split('_')[1]\n }\n\n async save () {\n // TODO if entire obj saved in manfest, can just pass our own fields\n let address = `${type}/mod_${this._firstModerator}`\n address += this._members ? '/members' : ''\n const manifest = { address }\n if (this._encKeyId) manifest.encKeyId = this._encKeyId\n return manifest\n }\n\n static async create (orbitdb, options = {}) {\n let firstModerator, members, encKeyId\n\n if (options.address) {\n members = options.address.includes('members')\n firstModerator = options.address.split('/')[1].split('_')[1]\n encKeyId = options.encKeyId\n } else {\n members = options.members\n firstModerator = options.firstModerator\n encKeyId = options.encKeyId\n }\n\n if (!firstModerator) throw new Error('Moderator AC: firstModerator required')\n return new ModeratorAccessController(firstModerator, {members, encKeyId})\n }\n}\n\nmodule.exports = ModeratorAccessController\n\n\n//# sourceURL=webpack://Box/./node_modules/3box-orbitdb-plugins/src/moderatorAccessController.js?");
/***/ }),
/***/ "./node_modules/3box-orbitdb-plugins/src/odbIdentityProvider.js":
/*!**********************************************************************!*\
!*** ./node_modules/3box-orbitdb-plugins/src/odbIdentityProvider.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("const base64url = __webpack_require__(/*! base64url */ \"./node_modules/base64url/index.js\")\nconst { verifyJWT } = __webpack_require__(/*! did-jwt */ \"./node_modules/did-jwt/lib/index.js\")\n\nconst encodeSection = data => base64url.encode(JSON.stringify(data))\n\nconst TYPE = '3ID'\nconst JWT_HEADER = encodeSection({ typ: 'JWT', alg: 'ES256K' })\n\nclass OdbIdentityProvider {\n constructor ({ threeId }) {\n // super(options)\n this.threeId = threeId\n }\n\n static get type () {\n return '3ID'\n }\n\n async getId ({ space }) {\n if (space) {\n return this.threeId.getSubDID(space)\n } else {\n return this.threeId.DID\n }\n }\n\n async signIdentity (data, { space }) {\n const payload = {\n data,\n iat: null\n }\n const opts = !space ? { use3ID: true } : { space }\n return (await this.threeId.signJWT(payload, opts)).split('.')[2]\n }\n\n static async setDidResolver(resolver) {\n this._resolver = resolver\n }\n\n static async verifyIdentity (identity) {\n if (!this._resolver) {\n throw new Error('The DID resolver must first be set with setDidResolver()')\n }\n const payload = encodeSection({\n iat: null,\n data: identity.publicKey + identity.signatures.id,\n iss: identity.id\n })\n const jwt = `${JWT_HEADER}.${payload}.${identity.signatures.publicKey}`\n try {\n await verifyJWT(jwt, { auth: true, resolver: this._resolver })\n } catch (e) {\n return false\n }\n return true\n }\n}\n\nmodule.exports = OdbIdentityProvider\n\n\n//# sourceURL=webpack://Box/./node_modules/3box-orbitdb-plugins/src/odbIdentityProvider.js?");
/***/ }),
/***/ "./node_modules/3box-orbitdb-plugins/src/threadAccessController.js":
/*!*************************************************************************!*\
!*** ./node_modules/3box-orbitdb-plugins/src/threadAccessController.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("const ensureAddress = __webpack_require__(/*! orbit-db-access-controllers/src/utils/ensure-ac-address */ \"./node_modules/orbit-db-access-controllers/src/utils/ensure-ac-address.js\")\nconst EventEmitter = __webpack_require__(/*! events */ \"./node_modules/events/events.js\").EventEmitter\nconst entryIPFS = __webpack_require__(/*! ipfs-log/src/entry */ \"./node_modules/ipfs-log/src/entry.js\")\nconst isIPFS = __webpack_require__(/*! is-ipfs */ \"./node_modules/is-ipfs/src/index.js\")\nconst orbitAddress = __webpack_require__(/*! orbit-db/src/orbit-db-address */ \"./node_modules/orbit-db/src/orbit-db-address.js\")\n\nconst type = 'thread-access'\nconst MODERATOR = 'MODERATOR'\nconst MEMBER = 'MEMBER'\n\nconst isValid3ID = did => {\n const parts = did.split(':')\n if (!parts[0] === 'did' || !parts[1] === '3') return false\n return isIPFS.cid(parts[2])\n}\n\nclass ThreadAccessController extends EventEmitter{\n constructor (orbitdb, ipfs, identity, firstModerator, options) {\n super()\n this._orbitdb = orbitdb\n this._db = null\n this._options = options || {}\n this._ipfs = ipfs\n this._members = Boolean(options.members)\n this._firstModerator = firstModerator\n this._threadName = options.threadName\n this._identity = identity\n this._encKeyId = options.encKeyId\n }\n\n static get type () { return type }\n\n // return address of AC (in this case orbitdb address of AC)\n get address () {\n return this._db.address\n }\n\n async canAppend (entry, identityProvider) {\n const trueIfValidSig = async () => await identityProvider.verifyIdentity(entry.identity)\n\n const op = entry.payload.op\n const mods = this.capabilities['moderators']\n const members = this.capabilities['members']\n const isMod = mods.includes(entry.identity.id)\n const isMember = members.includes(entry.identity.id)\n\n if (op === 'ADD') {\n // Anyone can add entry if open thread\n if (!this._members) return await trueIfValidSig()\n // Not open thread, any member or mod can add to thread\n if (isMember || isMod) return await trueIfValidSig()\n }\n\n if (op === 'DEL') {\n const hash = entry.payload.value\n const delEntry = await entryIPFS.fromMultihash(this._ipfs, hash)\n\n // An id can delete their own entries\n if (delEntry.identity.id === entry.identity.id) return await trueIfValidSig()\n\n // Mods can delete any entry\n if (isMod) return await trueIfValidSig()\n }\n\n return false\n }\n\n get capabilities () {\n if (!this._capabilities) this._updateCapabilites()\n return this._capabilities\n }\n\n getEncryptedKey (did) {\n if (!this._encKeyId) throw new Error(`getEncryptedKey: only available for confidential threads`)\n const didEntries = Object.entries(this._db.index).map(entry => {\n return {\n id: entry[1].payload.value.id,\n encryptedReadKey: entry[1].payload.value.encryptedReadKey\n }\n }).filter(entry => {\n return entry.id === did\n })\n\n if (didEntries.length === 0 ) throw new Error(`getEncryptedKey: no access for ${did}`)\n return didEntries[0].encryptedReadKey\n }\n\n _updateCapabilites () {\n let moderators = [], members = []\n if (this._db) {\n moderators.push(this._db.access._firstModerator)\n Object.entries(this._db.index).forEach(entry => {\n const capability = entry[1].payload.value.capability\n const id = entry[1].payload.value.id\n if (capability === MODERATOR) {\n if (!moderators.includes(id)) moderators.push(id)\n }\n if (capability === MEMBER) members.push(id)\n })\n }\n this._capabilities = {moderators, members}\n return this._capabilities\n }\n\n get (capability) {\n return this.capabilities[capability] || []\n }\n\n async close () {\n await this._db.close()\n }\n\n async load (address) {\n const isAddress = orbitAddress.isValid(address)\n if (this._db) { await this._db.close() }\n\n // TODO - skip manifest for mod-access\n this._db = await this._orbitdb.feed(ensureAddress(address), this._createOrbitOpts(isAddress))\n\n this._db.events.on('ready', this._onUpdate.bind(this))\n this._db.events.on('write', this._onUpdate.bind(this))\n this._db.events.on('replicated', this._onUpdate.bind(this))\n\n await this._db.load()\n }\n\n _createOrbitOpts(loadByAddress = false) {\n const accessController = {\n type: 'moderator-access',\n firstModerator: this._firstModerator,\n members: this._members,\n encKeyId: this._encKeyId\n }\n\n const opts = {\n identity: this._identity,\n sync: true\n }\n\n return Object.assign(opts, loadByAddress ? {} : { accessController })\n }\n\n async save () {\n const address = await this._orbitdb.determineAddress(`${this._threadName}/_access`, 'feed', this._createOrbitOpts())\n\n const manifest = {\n address: address.toString(),\n firstModerator: this._firstModerator,\n members: this._members\n }\n if (this._encKeyId) manifest.encKeyId = this._encKeyId\n return manifest\n }\n\n async grant (capability, id, encryptedReadKey) {\n if (!this._db.access.isValidCapability(capability)) {\n throw new Error('grant: Invalid capability to grant')\n }\n if (capability === MEMBER && this.capabilities['members'].includes(id)) {\n throw new Error(`grant: capability ${capability} has already been granted to ${id}`)\n }\n // length 1 allows first mod to add entry with encryptedReadKey\n if (capability === MODERATOR && this.capabilities['moderators'].includes(id) && this.capabilities['moderators'].length !== 1) {\n throw new Error(`grant: capability ${capability} has already been granted to ${id}`)\n }\n if (this._encKeyId && !encryptedReadKey) {\n throw new Error('grant: confidential threads require access to be granted with encrypted key')\n }\n try {\n const entry = {capability, id}\n if (encryptedReadKey) entry.encryptedReadKey = encryptedReadKey\n await this._db.add(entry)\n } catch (e) {\n if (e.toString().includes('not append entry')) throw new Error(`grant: Capability ${capability} can not be granted to ${id}`)\n throw e\n }\n }\n\n _onUpdate () {\n this._updateCapabilites()\n this.emit('updated')\n }\n\n /* Factory */\n static async create (orbitdb, options = {}) {\n if (!options.firstModerator) throw new Error('Thread AC: firstModerator required')\n if (options.address) options.threadName = options.address.split('/')[3]\n return new ThreadAccessController(orbitdb, orbitdb._ipfs, options.identity, options.firstModerator, options)\n }\n}\n\nmodule.exports = ThreadAccessController\n\n\n//# sourceURL=webpack://Box/./node_modules/3box-orbitdb-plugins/src/threadAccessController.js?");
/***/ }),
/***/ "./node_modules/3box/lib/3id/index.js":
/*!********************************************!*\
!*** ./node_modules/3box/lib/3id/index.js ***!
\********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("/* WEBPACK VAR INJECTION */(function(Buffer) {\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\");\n\nvar _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\"));\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\"));\n\nvar _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\"));\n\nvar _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\"));\n\nfunction _createForOfIteratorHelper(o) { if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } 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 it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _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(n); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _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; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar _require = __webpack_require__(/*! @ethersproject/hdnode */ \"./node_modules/@ethersproject/hdnode/lib.esm/index.js\"),\n mnemonicToSeed = _require.mnemonicToSeed,\n entropyToMnemonic = _require.entropyToMnemonic;\n\nvar EventEmitter = __webpack_require__(/*! events */ \"./node_modules/events/events.js\");\n\nvar didJWT = __webpack_require__(/*! did-jwt */ \"./node_modules/did-jwt/lib/index.js\");\n\nvar _require2 = __webpack_require__(/*! did-resolver */ \"./node_modules/did-resolver/lib/resolver.esm.js\"),\n Resolver = _require2.Resolver;\n\nvar get3IdResolver = __webpack_require__(/*! 3id-resolver */ \"./node_modules/3id-resolver/lib/resolver.js\").getResolver;\n\nvar getMuportResolver = __webpack_require__(/*! muport-did-resolver */ \"./node_modules/muport-did-resolver/lib/resolver.js\").getResolver;\n\nvar DidDocument = __webpack_require__(/*! ipfs-did-document */ \"./node_modules/ipfs-did-document/index.js\");\n\nvar localstorage = __webpack_require__(/*! store */ \"./node_modules/store/dist/store.legacy.js\");\n\nvar Identities = __webpack_require__(/*! orbit-db-identity-provider */ \"./node_modules/orbit-db-identity-provider/index.js\");\n\nvar _require3 = __webpack_require__(/*! 3box-orbitdb-plugins */ \"./node_modules/3box-orbitdb-plugins/src/index.js\"),\n OdbIdentityProvider = _require3.OdbIdentityProvider;\n\nIdentities.addIdentityProvider(OdbIdentityProvider);\n\nvar utils = __webpack_require__(/*! ../utils/index */ \"./node_modules/3box/lib/utils/index.js\");\n\nvar Keyring = __webpack_require__(/*! ./keyring */ \"./node_modules/3box/lib/3id/keyring.js\");\n\nvar config = __webpack_require__(/*! ../config.js */ \"./node_modules/3box/lib/config.js\");\n\nvar nacl = __webpack_require__(/*! tweetnacl */ \"./node_modules/tweetnacl/nacl-fast.js\");\n\nvar _require4 = __webpack_require__(/*! ./utils */ \"./node_modules/3box/lib/3id/utils.js\"),\n randomNonce = _require4.randomNonce;\n\nvar DID_METHOD_NAME = '3';\nvar STORAGE_KEY = 'serialized3id_';\nvar MUPORT_IPFS = {\n host: config.muport_ipfs_host,\n port: config.muport_ipfs_port,\n protocol: config.muport_ipfs_protocol\n};\nvar POLL_INTERVAL = 500;\n\nvar ThreeId = /*#__PURE__*/function () {\n function ThreeId(provider, ipfs, keystore) {\n var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n (0, _classCallCheck2[\"default\"])(this, ThreeId);\n this.events = new EventEmitter();\n this._provider = provider;\n this._has3idProv = Boolean(opts.has3idProv);\n this._ipfs = ipfs;\n this._muportIpfs = opts.muportIpfs || MUPORT_IPFS;\n this._pubkeys = {\n spaces: {}\n };\n this._keystore = keystore;\n var threeIdResolver = get3IdResolver(ipfs, {\n pin: true\n });\n var muportResolver = getMuportResolver(ipfs);\n var resolver = new Resolver(_objectSpread({}, threeIdResolver, {}, muportResolver));\n OdbIdentityProvider.setDidResolver(resolver);\n }\n\n (0, _createClass2[\"default\"])(ThreeId, [{\n key: \"startUpdatePolling\",\n value: function startUpdatePolling() {\n var _this = this;\n\n if (this._has3idProv) {\n var poll = /*#__PURE__*/function () {\n var _ref = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee(method, event) {\n var result;\n return _regenerator[\"default\"].wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return utils.callRpc(_this._provider, method);\n\n case 2:\n result = _context.sent;\n result.map(function (data) {\n _this.events.emit(event, data);\n });\n\n case 4:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function poll(_x, _x2) {\n return _ref.apply(this, arguments);\n };\n }();\n\n this._pollInterval = setInterval(function () {\n poll('3id_newAuthMethodPoll', 'new-auth-method');\n poll('3id_newLinkPoll', 'new-link-proof');\n }, POLL_INTERVAL);\n }\n }\n }, {\n key: \"signJWT\",\n value: function () {\n var _signJWT = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee2(payload) {\n var _ref2,\n space,\n expiresIn,\n issuer,\n keyring,\n settings,\n _args2 = arguments;\n\n return _regenerator[\"default\"].wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _ref2 = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {}, space = _ref2.space, expiresIn = _ref2.expiresIn;\n issuer = this.DID;\n\n if (space) {\n issuer = this._subDIDs[space];\n }\n\n if (!this._has3idProv) {\n _context2.next = 7;\n break;\n }\n\n return _context2.abrupt(\"return\", utils.callRpc(this._provider, '3id_signClaim', {\n payload: payload,\n did: issuer,\n space: space,\n expiresIn: expiresIn\n }));\n\n case 7:\n keyring = this._keyringBySpace(space);\n settings = {\n signer: keyring.getJWTSigner(),\n issuer: issuer,\n expiresIn: expiresIn\n };\n return _context2.abrupt(\"return\", didJWT.createJWT(payload, settings));\n\n case 10:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function signJWT(_x3) {\n return _signJWT.apply(this, arguments);\n }\n\n return signJWT;\n }()\n }, {\n key: \"getSubDID\",\n value: function getSubDID(space) {\n return this._subDIDs[space];\n }\n }, {\n key: \"getOdbId\",\n value: function () {\n var _getOdbId = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee3(space) {\n return _regenerator[\"default\"].wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n return _context3.abrupt(\"return\", Identities.createIdentity({\n type: '3ID',\n threeId: this,\n space: space,\n keystore: this._keystore\n }));\n\n case 1:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n function getOdbId(_x4) {\n return _getOdbId.apply(this, arguments);\n }\n\n return getOdbId;\n }()\n }, {\n key: \"serializeState\",\n value: function serializeState() {\n var _this2 = this;\n\n if (this._has3idProv) throw new Error('Can not serializeState of IdentityWallet');\n var stateObj = {\n managementAddress: this.managementAddress,\n seed: this._mainKeyring.serialize(),\n spaceSeeds: {}\n };\n Object.keys(this._keyrings).map(function (name) {\n stateObj.spaceSeeds[name] = _this2._keyrings[name].serialize();\n });\n return JSON.stringify(stateObj);\n }\n }, {\n key: \"_initKeys\",\n value: function _initKeys(serializedState) {\n var _this3 = this;\n\n if (this._has3idProv) throw new Error('Can not initKeys of IdentityWallet');\n this._keyrings = {};\n var state = JSON.parse(serializedState); // TODO remove toLowerCase() in future, should be sanitized elsewhere\n // this forces existing state to correct state so that address <->\n // rootstore relation holds\n\n this.managementAddress = state.managementAddress.toLowerCase();\n this._mainKeyring = new Keyring(state.seed);\n Object.keys(state.spaceSeeds).map(function (name) {\n _this3._keyrings[name] = new Keyring(state.spaceSeeds[name]);\n });\n localstorage.set(STORAGE_KEY + this.managementAddress, this.serializeState());\n }\n }, {\n key: \"_initDID\",\n value: function () {\n var _initDID2 = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee4() {\n var _this4 = this;\n\n var muportPromise, spaces, subDIDs;\n return _regenerator[\"default\"].wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n muportPromise = this._initMuport();\n _context4.next = 3;\n return this._init3ID();\n\n case 3:\n this._rootDID = _context4.sent;\n\n if (this._has3idProv) {\n spaces = Object.keys(this._pubkeys.spaces);\n } else {\n spaces = Object.keys(this._keyrings);\n }\n\n _context4.next = 7;\n return Promise.all(spaces.map(function (space) {\n return _this4._init3ID(space);\n }));\n\n case 7:\n subDIDs = _context4.sent;\n this._subDIDs = {};\n spaces.map(function (space, i) {\n _this4._subDIDs[space] = subDIDs[i];\n });\n _context4.next = 12;\n return muportPromise;\n\n case 12:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n function _initDID() {\n return _initDID2.apply(this, arguments);\n }\n\n return _initDID;\n }()\n }, {\n key: \"_init3ID\",\n value: function () {\n var _init3ID2 = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee5(spaceName) {\n var doc, pubkeys, payload, signature;\n return _regenerator[\"default\"].wrap(function _callee5$(_context5) {\n while (1) {\n switch (_context5.prev = _context5.next) {\n case 0:\n doc = new DidDocument(this._ipfs, DID_METHOD_NAME);\n _context5.next = 3;\n return this.getPublicKeys(spaceName, true);\n\n case 3:\n pubkeys = _context5.sent;\n\n if (spaceName) {\n _context5.next = 11;\n break;\n }\n\n doc.addPublicKey('signingKey', 'Secp256k1VerificationKey2018', 'publicKeyHex', pubkeys.signingKey);\n doc.addPublicKey('encryptionKey', 'Curve25519EncryptionPublicKey', 'publicKeyBase64', pubkeys.asymEncryptionKey);\n doc.addPublicKey('managementKey', 'Secp256k1VerificationKey2018', 'ethereumAddress', pubkeys.managementKey);\n doc.addAuthentication('Secp256k1SignatureAuthentication2018', 'signingKey');\n _context5.next = 21;\n break;\n\n case 11:\n doc.addPublicKey('subSigningKey', 'Secp256k1VerificationKey2018', 'publicKeyHex', pubkeys.signingKey);\n doc.addPublicKey('subEncryptionKey', 'Curve25519EncryptionPublicKey', 'publicKeyBase64', pubkeys.asymEncryptionKey);\n doc.addAuthentication('Secp256k1SignatureAuthentication2018', 'subSigningKey');\n doc.addCustomProperty('space', spaceName);\n doc.addCustomProperty('root', this.DID);\n payload = {\n subSigningKey: pubkeys.signingKey,\n subEncryptionKey: pubkeys.asymEncryptionKey,\n space: spaceName,\n iat: null\n };\n _context5.next = 19;\n return this.signJWT(payload, {\n use3ID: true\n });\n\n case 19:\n signature = _context5.sent.split('.')[2];\n doc.addCustomProperty('proof', {\n alg: 'ES256K',\n signature: signature\n });\n\n case 21:\n _context5.next = 23;\n return doc.commit({\n noTimestamp: true\n });\n\n case 23:\n return _context5.abrupt(\"return\", doc.DID);\n\n case 24:\n case \"end\":\n return _context5.stop();\n }\n }\n }, _callee5, this);\n }));\n\n function _init3ID(_x5) {\n return _init3ID2.apply(this, arguments);\n }\n\n return _init3ID;\n }()\n }, {\n key: \"_initMuport\",\n value: function () {\n var _initMuport2 = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee6() {\n var keys, doc, docHash;\n return _regenerator[\"default\"].wrap(function _callee6$(_context6) {\n while (1) {\n switch (_context6.prev = _context6.next) {\n case 0:\n _context6.next = 2;\n return this.getPublicKeys(null);\n\n case 2:\n keys = _context6.sent;\n doc = createMuportDocument(keys.signingKey, keys.managementKey, keys.asymEncryptionKey);\n _context6.next = 6;\n return this._ipfs.add(Buffer.from(JSON.stringify(doc)));\n\n case 6:\n docHash = _context6.sent[0].hash;\n this._muportDID = 'did:muport:' + docHash;\n this.muportFingerprint = utils.sha256Multihash(this.muportDID);\n\n case 9:\n case \"end\":\n return _context6.stop();\n }\n }\n }, _callee6, this);\n }));\n\n function _initMuport() {\n return _initMuport2.apply(this, arguments);\n }\n\n return _initMuport;\n }()\n }, {\n key: \"getAddress\",\n value: function () {\n var _getAddress = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee7() {\n return _regenerator[\"default\"].wrap(function _callee7$(_context7) {\n while (1) {\n switch (_context7.prev = _context7.next) {\n case 0:\n if (!this._has3idProv) {\n _context7.next = 4;\n break;\n }\n\n return _context7.abrupt(\"return\", utils.callRpc(this._provider, '3id_getLink'));\n\n case 4:\n return _context7.abrupt(\"return\", this.managementAddress);\n\n case 5:\n case \"end\":\n return _context7.stop();\n }\n }\n }, _callee7, this);\n }));\n\n function getAddress() {\n return _getAddress.apply(this, arguments);\n }\n\n return getAddress;\n }()\n }, {\n key: \"linkManagementAddress\",\n value: function () {\n var _linkManagementAddress = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee8() {\n return _regenerator[\"default\"].wrap(function _callee8$(_context8) {\n while (1) {\n switch (_context8.prev = _context8.next) {\n case 0:\n if (!this._has3idProv) {\n _context8.next = 2;\n break;\n }\n\n return _context8.abrupt(\"return\", utils.callRpc(this._provider, '3id_linkManagementKey'));\n\n case 2:\n case \"end\":\n return _context8.stop();\n }\n }\n }, _callee8, this);\n }));\n\n function linkManagementAddress() {\n return _linkManagementAddress.apply(this, arguments);\n }\n\n return linkManagementAddress;\n }()\n }, {\n key: \"authenticate\",\n value: function () {\n var _authenticate = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee9(spaces) {\n var opts,\n pubkeys,\n _iterator,\n _step,\n space,\n _iterator2,\n _step2,\n _space,\n _args9 = arguments;\n\n return _regenerator[\"default\"].wrap(function _callee9$(_context9) {\n while (1) {\n switch (_context9.prev = _context9.next) {\n case 0:\n opts = _args9.length > 1 && _args9[1] !== undefined ? _args9[1] : {};\n spaces = spaces || [];\n\n if (!this._has3idProv) {\n _context9.next = 34;\n break;\n }\n\n _context9.next = 5;\n return utils.callRpc(this._provider, '3id_authenticate', {\n spaces: spaces,\n authData: opts.authData,\n address: opts.address\n });\n\n case 5:\n pubkeys = _context9.sent;\n this._pubkeys.main = pubkeys.main;\n this._pubkeys.spaces = Object.assign(this._pubkeys.spaces, pubkeys.spaces);\n\n if (this.DID) {\n _context9.next = 13;\n break;\n }\n\n _context9.next = 11;\n return this._initDID();\n\n case 11:\n _context9.next = 32;\n break;\n\n case 13:\n _iterator = _createForOfIteratorHelper(spaces);\n _context9.prev = 14;\n\n _iterator.s();\n\n case 16:\n if ((_step = _iterator.n()).done) {\n _context9.next = 24;\n break;\n }\n\n space = _step.value;\n\n if (this._subDIDs[space]) {\n _context9.next = 22;\n break;\n }\n\n _context9.next = 21;\n return this._init3ID(space);\n\n case 21:\n this._subDIDs[space] = _context9.sent;\n\n case 22:\n _context9.next = 16;\n break;\n\n case 24:\n _context9.next = 29;\n break;\n\n case 26:\n _context9.prev = 26;\n _context9.t0 = _context9[\"catch\"](14);\n\n _iterator.e(_context9.t0);\n\n case 29:\n _context9.prev = 29;\n\n _iterator.f();\n\n return _context9.finish(29);\n\n case 32:\n _context9.next = 51;\n break;\n\n case 34:\n _iterator2 = _createForOfIteratorHelper(spaces);\n _context9.prev = 35;\n\n _iterator2.s();\n\n case 37:\n if ((_step2 = _iterator2.n()).done) {\n _context9.next = 43;\n break;\n }\n\n _space = _step2.value;\n _context9.next = 41;\n return this._initKeyringByName(_space);\n\n case 41:\n _context9.next = 37;\n break;\n\n case 43:\n _context9.next = 48;\n break;\n\n case 45:\n _context9.prev = 45;\n _context9.t1 = _context9[\"catch\"](35);\n\n _iterator2.e(_context9.t1);\n\n case 48:\n _context9.prev = 48;\n\n _iterator2.f();\n\n return _context9.finish(48);\n\n case 51:\n case \"end\":\n return _context9.stop();\n }\n }\n }, _callee9, this, [[14, 26, 29, 32], [35, 45, 48, 51]]);\n }));\n\n function authenticate(_x6) {\n return _authenticate.apply(this, arguments);\n }\n\n return authenticate;\n }()\n }, {\n key: \"isAuthenticated\",\n value: function () {\n var _isAuthenticated = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee10() {\n var _this5 = this;\n\n var spaces,\n _args10 = arguments;\n return _regenerator[\"default\"].wrap(function _callee10$(_context10) {\n while (1) {\n switch (_context10.prev = _context10.next) {\n case 0:\n spaces = _args10.length > 0 && _args10[0] !== undefined ? _args10[0] : [];\n return _context10.abrupt(\"return\", spaces.reduce(function (acc, space) {\n return acc && Object.keys(_this5._subDIDs).includes(space);\n }, true));\n\n case 2:\n case \"end\":\n return _context10.stop();\n }\n }\n }, _callee10);\n }));\n\n function isAuthenticated() {\n return _isAuthenticated.apply(this, arguments);\n }\n\n return isAuthenticated;\n }()\n }, {\n key: \"_initKeyringByName\",\n value: function () {\n var _initKeyringByName2 = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee11(name) {\n var sig, entropy, seed;\n return _regenerator[\"default\"].wrap(function _callee11$(_context11) {\n while (1) {\n switch (_context11.prev = _context11.next) {\n case 0:\n if (!this._has3idProv) {\n _context11.next = 2;\n break;\n }\n\n throw new Error('Can not initKeyringByName of IdentityWallet');\n\n case 2:\n if (this._keyrings[name]) {\n _context11.next = 16;\n break;\n }\n\n _context11.next = 5;\n return utils.openSpaceConsent(this.managementAddress, this._provider, name);\n\n case 5:\n sig = _context11.sent;\n entropy = '0x' + utils.sha256(sig.slice(2));\n seed = mnemonicToSeed(entropyToMnemonic(entropy));\n this._keyrings[name] = new Keyring(seed);\n _context11.next = 11;\n return this._init3ID(name);\n\n case 11:\n this._subDIDs[name] = _context11.sent;\n localstorage.set(STORAGE_KEY + this.managementAddress, this.serializeState());\n return _context11.abrupt(\"return\", true);\n\n case 16:\n return _context11.abrupt(\"return\", false);\n\n case 17:\n case \"end\":\n return _context11.stop();\n }\n }\n }, _callee11, this);\n }));\n\n function _initKeyringByName(_x7) {\n return _initKeyringByName2.apply(this, arguments);\n }\n\n return _initKeyringByName;\n }()\n }, {\n key: \"getPublicKeys\",\n value: function () {\n var _getPublicKeys = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee12(space, uncompressed) {\n var pubkeys;\n return _regenerator[\"default\"].wrap(function _callee12$(_context12) {\n while (1) {\n switch (_context12.prev = _context12.next) {\n case 0:\n if (this._has3idProv) {\n pubkeys = Object.assign({}, space ? this._pubkeys.spaces[space] : this._pubkeys.main);\n\n if (uncompressed) {\n pubkeys.signingKey = Keyring.uncompress(pubkeys.signingKey);\n }\n } else {\n pubkeys = this._keyringBySpace(space).getPublicKeys(uncompressed);\n pubkeys.managementKey = this.managementAddress;\n }\n\n return _context12.abrupt(\"return\", pubkeys);\n\n case 2:\n case \"end\":\n return _context12.stop();\n }\n }\n }, _callee12, this);\n }));\n\n function getPublicKeys(_x8, _x9) {\n return _getPublicKeys.apply(this, arguments);\n }\n\n return getPublicKeys;\n }()\n }, {\n key: \"encrypt\",\n value: function () {\n var _encrypt = (0, _asyncToGenerator2[\"default\"])( /*#__PURE__*/_regenerator[\"default\"].mark(function _callee13(message, space, to) {\n var keyring, paddedMsg;\n return _regenerator[\"default\"].wrap(function _callee13$(_context13) {\n while (1) {\n switch (_context13.prev = _context13.next) {\n case 0:\n if (!this._has3idProv) {\n