universa-core2 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/models/universa_contract.ts","../src/boss.ts","../src/models/roles/role_link.ts","../src/models/reference.ts","../src/models/permissions/permission.ts","../src/models/permissions/revoke_permission.ts","../src/models/capsule.ts","../src/models/contract.ts","../src/models/hash_id.ts","../src/models/compound.ts","../src/models/transaction_pack.ts","../src/models/parcel.ts","../src/models/key_record.ts","../src/utils.ts","../src/models/roles/role_simple.ts","../src/models/roles/role_list.ts","../src/models/permissions/change_owner_permission.ts","../src/models/permissions/modify_data_permission.ts","../src/models/permissions/change_number_permission.ts","../src/models/permissions/split_join_permission.ts","../src/network/node_connection.ts","../src/network/node.ts","../src/network/topology.ts","../src/network/estimator.ts","../src/network/index.ts"],"sourcesContent":["export * from 'unicrypto';\nexport * from './models';\n\nimport Network from './network';\nimport { NetworkApproval } from './network';\nimport { Node } from './network/node';\nimport Topology from './network/topology';\n\nexport {\n Node,\n Network,\n NetworkApproval,\n Topology\n};\n\n","import { BossSerializable, shortId } from 'unicrypto';\nimport BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\nimport { Role, RoleDictionary } from './roles/role';\nimport RoleLink from './roles/role_link';\nimport HashId from './hash_id';\nimport Reference from './reference';\nimport Permission from './permissions/permission';\nimport RevokePermission from './permissions/revoke_permission';\n\nexport interface State {\n createdAt: Date,\n expiresAt: Date,\n owner: Role,\n creator: Role,\n data: any,\n revision: number,\n roles: RoleDictionary,\n parent: HashId | null,\n origin: HashId | null,\n branchId?: string | null,\n references?: Array<Reference>\n}\n\nexport interface Definition {\n issuer: Role,\n permissions: { [id: string]: Permission },\n createdAt: Date,\n data: any,\n references?: Array<Reference>\n}\n\ninterface UniversaContractSerialized {\n api_level: number,\n definition: any,\n state: any,\n transactional?: any\n}\n\ninterface ContractCreateOptions {\n createdAt?: Date,\n expiresAt?: Date | string\n}\n\nconst DEFAULT_EXPIRES_AT = 5; // years\nconst DEFAULT_API_LEVEL = 4;\n\nfunction uniqueShortId(existing: Array<string>): string {\n const maxIterations = 100000;\n let found = false;\n let id = '';\n let i = 0;\n\n while (i < maxIterations && !found) {\n id = shortId();\n if (existing.indexOf(id) !== -1) found = true;\n i++;\n }\n\n return id;\n}\n\nexport class UniversaContract implements BossSerializable {\n apiLevel: number;\n definition: Definition;\n state: State;\n transactional: any;\n\n constructor(\n apiLevel: number,\n definition: Definition,\n state: State,\n transactional: any\n ) {\n this.apiLevel = apiLevel;\n this.definition = definition;\n this.state = state;\n this.transactional = transactional;\n }\n\n static create(issuer: Role, options?: ContractCreateOptions) {\n const opts = options || {};\n const expiresAtOpt = opts.expiresAt;\n\n const createdAt = opts.createdAt || new Date();\n let expiresAt = new Date(createdAt.getTime());\n\n if (!expiresAtOpt) {\n expiresAt.setFullYear(expiresAt.getFullYear() + DEFAULT_EXPIRES_AT);\n } else if (typeof expiresAtOpt === 'string') {\n const tpe = expiresAtOpt.slice(-1);\n const amount = parseInt(expiresAtOpt.slice(0, expiresAtOpt.length - 1));\n\n if (tpe === 'd') expiresAt.setDate(expiresAt.getDate() + amount);\n if (tpe === 'm') expiresAt.setMonth(expiresAt.getMonth() + amount);\n if (tpe === 'y') expiresAt.setFullYear(expiresAt.getFullYear() + amount);\n } else {\n expiresAt = expiresAtOpt;\n }\n\n const revokePermission = RevokePermission.create('owner');\n const revokeId = shortId();\n\n const definition: Definition = {\n createdAt,\n issuer,\n permissions: { [revokeId]: revokePermission },\n data: {},\n references: []\n };\n\n const state: State = {\n createdAt,\n creator: new RoleLink('creator', 'issuer'),\n revision: 1,\n owner: new RoleLink('owner', 'issuer'),\n expiresAt,\n data: {},\n parent: null,\n origin: null,\n branchId: null,\n roles: {},\n references: []\n };\n\n return new UniversaContract(DEFAULT_API_LEVEL, definition, state, null);\n }\n\n get issuer() { return this.definition.issuer; }\n get owner() { return this.state.owner; }\n set owner(role: Role) { this.state.owner = role; }\n get creator() { return this.state.creator; }\n set creator(role: Role) { this.state.creator = role; }\n\n get parent() { return this.state.parent; }\n get origin() { return this.state.origin; }\n\n addPermission(permission: Permission) {\n const id = uniqueShortId(Object.keys(this.definition.permissions));\n this.definition.permissions[id] = permission;\n }\n\n removePermission(permissionId: string) {\n delete this.definition.permissions[permissionId];\n }\n\n setParent(id: HashId) { this.state.parent = id; }\n setOrigin(id: HashId) { this.state.origin = id; }\n setCreatorTo(roleName: string) {\n this.state.creator = new RoleLink('creator', roleName);\n };\n\n incrementRevision() { this.state.revision += 1; }\n\n static className = \"UniversaContract\";\n\n serializeToBOSS() {\n const d = this.definition;\n const s = this.state;\n\n const definitionSerialized = {\n 'issuer': d.issuer,\n 'permissions': d.permissions,\n 'created_at': d.createdAt,\n 'data': d.data,\n 'references': d.references\n };\n\n const stateSerialized = {\n 'created_at': s.createdAt,\n 'expires_at': s.expiresAt,\n 'owner': s.owner,\n 'created_by': s.creator,\n 'data': s.data,\n 'revision': s.revision,\n 'roles': s.roles,\n 'parent': s.parent,\n 'origin': s.origin,\n 'branch_id': s.branchId,\n 'references': s.references\n };\n\n const serialized: UniversaContractSerialized = {\n api_level: this.apiLevel,\n definition: definitionSerialized,\n state: stateSerialized\n };\n\n if (this.transactional || this.transactional === null)\n serialized.transactional = this.transactional;\n\n return serialized;\n }\n\n static deserializeFromBOSS(\n serialized: UniversaContractSerialized\n ): UniversaContract {\n const apiLevel = serialized['api_level'];\n const rawDefinition = serialized.definition;\n const rawState = serialized.state;\n let stateRoles = rawState.roles || {};\n\n // FIXME: some deprecated contracts contain roles as array, ignore it\n if (stateRoles instanceof Array) stateRoles = {};\n\n const definition = {\n issuer: rawDefinition.issuer,\n permissions: rawDefinition.permissions,\n createdAt: rawDefinition['created_at'],\n data: rawDefinition.data,\n references: rawDefinition.references || []\n };\n\n const state = {\n createdAt: rawState['created_at'],\n expiresAt: rawState['expires_at'],\n owner: rawState.owner,\n creator: rawState['created_by'],\n data: rawState.data,\n revision: rawState.revision,\n roles: stateRoles,\n parent: rawState.parent,\n origin: rawState.origin,\n branchId: rawState['branch_id'],\n references: rawState.references || []\n };\n\n return new UniversaContract(apiLevel, definition, state, serialized.transactional);\n }\n\n resetTransactional() { this.transactional = null; }\n createTransactional(id: string | null) {\n this.transactional = { id };\n }\n\n addReference(ref: Reference) {\n if (ref.type === Reference.TYPE_TRANSACTIONAL && !this.transactional)\n throw new Error('Can\\'t add transactional reference: transaction is empty');\n\n if (ref.type === Reference.TYPE_TRANSACTIONAL) {\n this.transactional.references = this.transactional.references || [];\n this.transactional.references.push(ref);\n }\n\n if (ref.type === Reference.TYPE_EXISTING_DEFINITION) {\n this.definition.references = this.definition.references || [];\n this.definition.references.push(ref);\n }\n\n if (ref.type === Reference.TYPE_EXISTING_STATE) {\n this.state.references = this.state.references || [];\n this.state.references.push(ref);\n }\n }\n}\n\nboss.register(\"UniversaContract\", UniversaContract);\n","import { Boss, BossSerializable, BossDeserializable } from 'unicrypto';\n\nclass BossSingleton {\n private static instance: BossSingleton;\n private constructor() {}\n\n static getInstance(): BossSingleton {\n if (!BossSingleton.instance) {\n BossSingleton.instance = new BossSingleton();\n }\n\n return BossSingleton.instance;\n }\n\n register<T extends BossSerializable>(alias: string, clz: BossDeserializable<T>) {\n return Boss.register(alias, clz);\n }\n\n dump(data: any): Uint8Array {\n return Boss.dump(data);\n }\n\n load(packed: Uint8Array): any {\n return Boss.load(packed);\n }\n}\n\nexport default BossSingleton;\n","import {\n KeyAddress,\n PublicKey,\n BossSerializable\n} from 'unicrypto';\n\nimport BossSingleton from '../../boss';\nconst boss = BossSingleton.getInstance();\n\nimport { Role, AvailableForOptions, RoleDictionary } from './role';\n\ninterface RoleLinkSerialized {\n name: string,\n target_name: string\n}\n\nexport default class RoleLink implements Role, BossSerializable {\n name: string;\n targetName: string;\n\n constructor(name: string, targetName: string) {\n this.name = name;\n this.targetName = targetName;\n }\n\n resolve(roles: RoleDictionary = {}, nestedLevel: number = 0) {\n if (nestedLevel >= 100) throw new Error(`Role \"${this.name}\" is circular`);\n\n const target = roles[this.targetName];\n\n if (!target) throw new Error(`Target role \"${this.targetName}\" is not found`);\n\n return target.resolve(roles, nestedLevel + 1);\n }\n\n async getSimpleAddress(roles: RoleDictionary = {}, ignoreRefs = true) {\n const target = this.resolve(roles);\n\n return target.getSimpleAddress(roles, ignoreRefs);\n }\n\n async availableFor(options: AvailableForOptions) {\n const finalTarget = this.resolve(options.roles);\n\n return finalTarget.availableFor(options);\n }\n\n // BOSS serialization definitions\n\n static className = \"RoleLink\";\n\n serializeToBOSS() {\n return {\n 'name': this.name,\n 'target_name': this.targetName\n };\n }\n\n static deserializeFromBOSS(serialized: RoleLinkSerialized): RoleLink {\n return new RoleLink(serialized.name, serialized['target_name']);\n }\n}\n\nboss.register(\"RoleLink\", RoleLink);\n","import { BossSerializable } from 'unicrypto';\nimport BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\nimport HashId from './hash_id';\n\nenum ReferenceType {\n TYPE_TRANSACTIONAL = 1,\n TYPE_EXISTING_DEFINITION = 2,\n TYPE_EXISTING_STATE = 3\n}\n\nexport default class Reference implements BossSerializable {\n static className = \"Reference\";\n static TYPE_TRANSACTIONAL = ReferenceType.TYPE_TRANSACTIONAL;\n static TYPE_EXISTING_DEFINITION = ReferenceType.TYPE_EXISTING_DEFINITION;\n static TYPE_EXISTING_STATE = ReferenceType.TYPE_EXISTING_STATE;\n\n fields: Array<any> = [];\n roles: Array<any> = [];\n signedBy: Array<any> = [];\n transactionalId: any = '';\n required: boolean = true;\n\n name: string;\n type: ReferenceType;\n where: any;\n\n constructor(\n name: string,\n type: ReferenceType,\n where: any\n ) {\n this.name = name;\n this.type = type;\n this.where = where;\n }\n\n serializeToBOSS() {\n return {\n 'fields': this.fields,\n 'roles': this.roles,\n 'signed_by': this.signedBy,\n 'transactional_id': this.transactionalId,\n 'required': this.required,\n 'name': this.name,\n 'type': this.type,\n 'where': this.where\n };\n }\n\n static deserializeFromBOSS(serialized: any) {\n const ref = new Reference(\n serialized['name'],\n serialized['type'],\n serialized['where']\n );\n\n ref.required = serialized.required;\n ref.transactionalId = serialized['transactional_id'];\n\n return ref;\n }\n}\n\nboss.register(\"Reference\", Reference);\n","import { KeyAddress, PublicKey } from 'unicrypto';\nimport { Role, AvailableForOptions } from '../roles/role';\nimport RoleLink from '../roles/role_link';\n\ntype Params = { [key: string]: any };\n\nexport default class Permission {\n name: string;\n role: Role;\n params: Params;\n\n constructor(\n role: Role,\n params: Params,\n name: string = Permission.DefaultName\n ) {\n this.name = name;\n this.role = role;\n this.params = params;\n }\n\n static DefaultName: string;\n\n static makeLink(\n name: string,\n roleName: string\n ) {\n return new RoleLink(`@${name}`, roleName);\n }\n\n availableFor(options: AvailableForOptions) {\n return this.role.availableFor(options);\n }\n\n serializeToBOSS() {\n return Object.assign({\n 'name': this.name,\n 'role': this.role\n }, this.params);\n }\n}\n\n","import { BossSerializable } from 'unicrypto';\nimport BossSingleton from '../../boss';\nconst boss = BossSingleton.getInstance();\nimport Permission from './permission';\nimport { Role } from '../roles/role';\n\nexport default class RevokePermission extends Permission implements BossSerializable {\n static DefaultName = \"revoke\";\n static className = \"RevokePermission\";\n\n constructor(role: Role, name: string = RevokePermission.DefaultName) {\n super(role, {}, name);\n }\n\n static create(roleName: string, name: string = RevokePermission.DefaultName) {\n return new RevokePermission(this.makeLink(name, roleName), name);\n }\n\n static deserializeFromBOSS(serialized: any): RevokePermission {\n return new RevokePermission(serialized.role, serialized.name);\n }\n}\n\nboss.register(\"RevokePermission\", RevokePermission);\n","import BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\nimport { Role } from './roles/role';\nimport { UniversaContract } from './universa_contract';\nimport Permission from './permissions/permission';\nimport HashId from './hash_id';\n\ninterface CapsuleOptions {\n new?: Array<HashId>,\n revoking?: Array<HashId>\n}\n\nexport interface CreateCapsuleOptions {\n definitionData?: any,\n stateData?: any,\n createdAt?: Date,\n expiresAt?: Date | string,\n permissions?: Array<Permission>,\n owner?: Role\n}\n\nexport default class Capsule {\n contract: UniversaContract;\n new: Array<HashId> = [];\n revoking: Array<HashId> = [];\n\n constructor(contract: UniversaContract, options?: CapsuleOptions) {\n this.contract = contract;\n\n if (options) {\n this.new = options.new || [];\n this.revoking = options.revoking || [];\n }\n }\n\n static unpack(bin: Uint8Array) {\n const raw = boss.load(bin);\n\n return new Capsule(raw.contract, { new: raw.new, revoking: raw.revoking });\n }\n\n static create(issuer: Role, options?: CreateCapsuleOptions) {\n const opts = options || {};\n\n const contract = UniversaContract.create(issuer, {\n createdAt: opts.createdAt,\n expiresAt: opts.expiresAt\n });\n\n if (opts.definitionData) contract.definition.data = opts.definitionData;\n if (opts.stateData) contract.state.data = opts.stateData;\n\n if (opts.permissions)\n opts.permissions.forEach(p => contract.addPermission(p));\n\n if (opts.owner) contract.owner = opts.owner;\n\n return new Capsule(contract);\n }\n\n get issuer() { return this.contract.issuer; }\n get owner() { return this.contract.owner; }\n set owner(role: Role) { this.contract.owner = role; }\n get creator() { return this.contract.creator; }\n set creator(role: Role) { this.contract.creator = role; }\n\n get parent() { return this.contract.parent; }\n get origin() { return this.contract.origin; }\n\n get definition() { return this.contract.definition; }\n get state() { return this.contract.state; }\n get transactional() { return this.contract.transactional; }\n\n pack() {\n return boss.dump({\n contract: this.contract,\n new: this.new,\n revoking: this.revoking\n });\n }\n}\n","import { KeyAddress, PublicKey, PrivateKey, encode64 } from 'unicrypto';\nimport BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\nimport Capsule from './capsule';\nimport Reference from './reference';\nimport { CreateCapsuleOptions } from './capsule';\nimport HashId from './hash_id';\nimport { Role } from './roles/role';\n\ninterface ContractOptions {\n type?: string,\n version?: number,\n binary?: Uint8Array\n}\n\ninterface signedByOptions {\n address?: KeyAddress,\n publicKey?: PublicKey\n}\n\nexport default class Contract {\n type: string;\n version: number;\n signatures: Array<Uint8Array>;\n data: Uint8Array;\n capsule: Capsule;\n binary: Uint8Array | null = null;\n\n constructor(\n data: Uint8Array,\n signatures?: Array<Uint8Array>,\n options?: ContractOptions\n ) {\n this.type = \"unicapsule\";\n this.version = 4;\n this.data = data;\n this.capsule = Capsule.unpack(data);\n this.signatures = signatures || [];\n\n if (options) {\n this.type = options.type || this.type;\n this.version = options.version || this.version;\n this.binary = options.binary || this.binary;\n }\n }\n\n get issuer() { return this.capsule.issuer; }\n get owner() { return this.capsule.owner; }\n set owner(role: Role) { this.capsule.owner = role; }\n get creator() { return this.capsule.creator; }\n set creator(role: Role) { this.capsule.creator = role; }\n\n setCreatorTo(roleName: string) {\n this.capsule.contract.setCreatorTo(roleName);\n }\n\n get parent() { return this.capsule.parent; }\n get origin() { return this.capsule.origin; }\n\n get definition() { return this.capsule.definition; }\n get state() { return this.capsule.state; }\n get transactional() { return this.capsule.transactional; }\n\n hashId() {\n if (this.binary) return HashId.calculate(this.binary);\n else throw new Error('contract is not packed yet');\n }\n\n async getSignatureKeys() {\n const keys = [];\n const signaturesTotal = this.signatures.length;\n let i = 0;\n\n const query = this.signatures.map(async (signature) => {\n const { exts } = boss.load(signature);\n const targetSignature = boss.load(exts);\n\n return await PublicKey.unpack(targetSignature['pub_key']);\n });\n\n return await Promise.all(query);\n }\n\n async isSignedBy(options: signedByOptions) {\n const { publicKey, address } = options;\n let signed = false;\n let i = 0;\n const signaturesTotal = this.signatures.length;\n const data = this.data;\n const self = this;\n\n if (publicKey == null && address == null) throw new Error(\"No address or key was given\");\n\n async function verify(index: number): Promise<boolean> {\n if (index >= signaturesTotal) return false;\n const signature = self.signatures[index];\n\n let pub = publicKey;\n if (pub != null) {\n const verified = await pub.verifyExtended(signature, data);\n if (verified) return true;\n } else {\n const { exts } = boss.load(signature);\n const targetSignature = boss.load(exts);\n const unpackedKey = await PublicKey.unpack(targetSignature['pub_key']);\n\n if (address?.isMatchingKey(unpackedKey)) return true;\n }\n\n return await verify(index + 1);\n }\n\n return await verify(0);\n }\n\n async sign(privateKey: PrivateKey) {\n const isSigned = await this.isSignedBy({ publicKey: privateKey.publicKey });\n\n if (isSigned) return;\n\n const signature = await privateKey.signExtended(this.data);\n\n this.signatures.push(signature);\n }\n\n static create(issuer: Role, options: CreateCapsuleOptions) {\n const capsule = Capsule.create(issuer, options);\n\n return new Contract(capsule.pack());\n }\n\n packData() {\n this.data = this.capsule.pack();\n this.signatures = [];\n }\n\n pack() {\n const packed = boss.dump({\n data: this.data,\n signatures: this.signatures,\n type: this.type,\n version: this.version\n });\n\n this.binary = packed;\n\n return packed;\n }\n\n async createRevision(createdAt?: Date) {\n const parentId = await this.hashId();\n\n if (!parentId || !this.binary)\n throw new Error('Can\\'t create revision of draft contract');\n\n const newRevision = Contract.unpack(this.binary);\n const capsule = newRevision.capsule;\n const unicontract = capsule.contract;\n\n unicontract.incrementRevision();\n if (!unicontract.origin) unicontract.setOrigin(parentId);\n unicontract.setParent(parentId);\n unicontract.state.createdAt = createdAt || new Date();\n\n capsule.new = [];\n capsule.revoking = [parentId];\n\n return newRevision;\n }\n\n static unpack(binary: Uint8Array) {\n const raw = boss.load(binary);\n\n return new Contract(raw.data, raw.signatures, {\n type: raw.type,\n version: raw.version,\n binary\n });\n }\n\n resetTransactional() { this.capsule.contract.resetTransactional(); }\n createTransactional(id: string | null) {\n this.capsule.contract.createTransactional(id);\n }\n\n addReference(ref: Reference) {\n this.capsule.contract.addReference(ref);\n }\n}\n","import {\n encode64,\n hashId,\n BossSerializable\n} from 'unicrypto';\nimport BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\n\ninterface HashIdSerialized {\n composite3: Uint8Array\n}\n\nexport default class HashId implements BossSerializable {\n composite3: Uint8Array;\n\n constructor(composite3: Uint8Array) {\n this.composite3 = composite3;\n }\n\n static async calculate(bin: Uint8Array) {\n return new HashId(await hashId(bin));\n }\n\n get base64() { return encode64(this.composite3); }\n\n equals(hashId: HashId) { return this.base64 === hashId.base64; }\n\n static className = \"HashId\";\n\n serializeToBOSS() {\n return { composite3: this.composite3 };\n }\n\n static deserializeFromBOSS(serialized: HashIdSerialized): HashId {\n return new HashId(serialized.composite3)\n }\n\n static unpack(bin: Uint8Array): HashId {\n return boss.load(bin) as HashId;\n }\n\n pack() {\n return boss.dump(this);\n }\n}\n\nboss.register(\"HashId\", HashId);\n","import { PrivateKey, decode64 } from 'unicrypto';\nimport TransactionPack from './transaction_pack';\nimport HashId from './hash_id';\n\nexport default class Compound {\n tpack: TransactionPack;\n\n constructor(tpack: TransactionPack) {\n this.tpack = tpack;\n }\n\n static unpack(bin: Uint8Array): Compound {\n return new Compound(TransactionPack.unpack(bin));\n }\n\n pack() {\n return this.tpack.pack();\n }\n\n private getDefinitionContracts() {\n return this.tpack.contract.definition.data.contracts;\n }\n\n // create(expiresAt: Date) {\n // const contract =\n // }\n\n getTags(): Array<string> {\n return Object.keys(this.getDefinitionContracts() || {});\n }\n\n sign(privateKey: PrivateKey) {\n return this.tpack.sign(privateKey);\n }\n\n async getTag(tag: string) {\n const contracts = this.getDefinitionContracts() || {};\n\n const contractInfo = contracts[tag];\n if (!contractInfo) return null;\n\n const mainId = new HashId(decode64(contractInfo.id));\n const mainContract = await this.tpack.getItem(mainId);\n\n const tpack = new TransactionPack(mainContract.binary as Uint8Array);\n\n const newItemIds = mainContract.capsule.new;\n const revokingItemIds = mainContract.capsule.revoking;\n const subItemIds = newItemIds.concat(revokingItemIds);\n\n for (let i = 0; i < subItemIds.length; i++) {\n let id = subItemIds[i];\n let contract = await this.tpack.getItem(id);\n await tpack.addSubItem(contract.binary as Uint8Array);\n }\n\n const refs: Array<string> = contractInfo.refs || [];\n\n for (let i = 0; i < refs.length; i++) {\n let id = new HashId(decode64(refs[i]));\n let contract = await this.tpack.getItem(id);\n await tpack.addReferencedItem(contract.binary as Uint8Array);\n }\n\n const tags: { [tag: string]: string } = contractInfo.tags || {};\n\n for (let tag in tags) {\n let id = new HashId(decode64(tags[tag]));\n await tpack.addTag(tag, id);\n }\n\n return tpack;\n }\n\n getItem(hashId: HashId) {\n return this.tpack.getItem(hashId);\n }\n}\n","import { BossSerializable, PrivateKey } from 'unicrypto';\nimport BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\nimport Contract from './contract';\nimport HashId from './hash_id';\n\ntype ItemRegistry = { [hashId: string]: Contract };\n\ninterface TransactionPackOptions {\n subItems?: Array<Uint8Array>,\n referencedItems?: Array<Uint8Array>,\n tags?: { [tag: string]: HashId },\n keys?: Array<Uint8Array>\n}\n\ninterface TaggedItem {\n hashId: HashId,\n contract: Contract\n}\n\nconst TAG_PREFIX_RESERVED = 'universa:';\n\nexport default class TransactionPack implements BossSerializable {\n contract: Contract;\n subItems: { [hashId64: string]: Contract } = {};\n referencedItems: { [hashId64: string]: Contract } = {};\n taggedItems: { [tag: string]: TaggedItem } = {};\n ready: Promise<void>;\n\n constructor(contractPacked: Uint8Array, options?: TransactionPackOptions) {\n const self = this;\n const opts = options || {};\n const subItemsPacked = opts.subItems || [];\n const referencedItemsPacked = opts.referencedItems || [];\n const tags: { [tag: string]: HashId } = opts.tags || {};\n\n this.contract = Contract.unpack(contractPacked);\n\n this.ready = new Promise((resolve, reject) => {\n const subLoaders = subItemsPacked.map(async (item) => {\n const contract = Contract.unpack(item);\n const hashId = await contract.hashId();\n\n self.subItems[hashId.base64] = contract;\n });\n\n const refLoaders = referencedItemsPacked.map(async (item) => {\n const contract = Contract.unpack(item);\n const hashId = await contract.hashId();\n\n self.referencedItems[hashId.base64] = contract;\n });\n\n const tagLoaders: Promise<void>[] = [];\n\n async function loadTag(tag: string) {\n const hashId = tags[tag];\n const hashId64 = hashId.base64;\n\n const contractId = await self.contract.hashId();\n\n if (contractId.base64 === hashId64) self.taggedItems[tag] = {\n contract: self.contract,\n hashId\n };\n\n const item = self.subItems[hashId64] || self.referencedItems[hashId64];\n if (item) self.taggedItems[tag] = { hashId, contract: item };\n }\n\n for (let tag in tags) tagLoaders.push(loadTag(tag));\n\n const loaders = subLoaders.concat(refLoaders).concat(tagLoaders);\n\n Promise.all(loaders).then(() => resolve());\n });\n }\n\n async getItem(hashId: HashId) {\n await this.ready;\n\n const hashId64 = hashId.base64;\n\n const contractId = await this.contract.hashId();\n if (contractId.base64 === hashId64) return this.contract;\n\n return this.subItems[hashId64] || this.referencedItems[hashId64];\n }\n\n async getTag(tag: string) {\n await this.ready;\n\n return this.taggedItems[tag];\n }\n\n async addTag(tag: string, hashId: HashId) {\n if (tag.startsWith(TAG_PREFIX_RESERVED))\n throw new Error('tag can\\'t start with reserved words');\n\n await this.ready;\n\n const contract = await this.getItem(hashId);\n if (!contract) throw new Error('Can\\'t add tag for non-existing item');\n\n this.taggedItems[tag] = {\n hashId,\n contract\n };\n }\n\n async addSubItem(itemPacked: Uint8Array) {\n const item = Contract.unpack(itemPacked);\n const hashId = await item.hashId();\n\n this.subItems[hashId.base64] = item;\n }\n\n async addReferencedItem(itemPacked: Uint8Array) {\n const item = Contract.unpack(itemPacked);\n const hashId = await item.hashId();\n\n this.referencedItems[hashId.base64] = item;\n }\n\n async pack() {\n await this.ready;\n\n return boss.dump(this);\n }\n\n static unpack(packed: Uint8Array): TransactionPack {\n return boss.load(packed) as TransactionPack;\n }\n\n static className = \"TransactionPack\";\n\n serializeToBOSS() {\n const subItems: Uint8Array[] = [];\n const referencedItems: Uint8Array[] = [];\n const tags: { [tag: string]: HashId } = {};\n\n for (let hashId64 in this.subItems) {\n subItems.push(this.subItems[hashId64].binary as Uint8Array);\n }\n\n for (let hashId64 in this.referencedItems) {\n referencedItems.push(this.referencedItems[hashId64].binary as Uint8Array);\n }\n\n for (let tag in this.taggedItems) {\n tags[tag] = this.taggedItems[tag].hashId;\n }\n\n return {\n contract: this.contract.binary,\n subItems,\n referencedItems,\n tags\n };\n }\n\n static deserializeFromBOSS(serialized: any) {\n return new TransactionPack(serialized.contract, {\n subItems: serialized.subItems || [],\n referencedItems: serialized.referencedItems || [],\n tags: serialized.tags || {}\n });\n }\n\n async sign(key: PrivateKey) {\n await this.contract.sign(key);\n // update binary. should update tags?\n this.contract.pack();\n }\n}\n\nboss.register(\"TransactionPack\", TransactionPack);\n","import { BossSerializable } from 'unicrypto';\nimport BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\n\nimport Big from 'big.js';\n// import Contract from './contract';\nimport HashId from './hash_id';\nimport TransactionPack from './transaction_pack';\n\n// type ItemRegistry = { [hashId: string]: Contract };\n\ninterface PaymentOptions {\n isTestnet?: boolean,\n createdAt?: Date\n}\n\nexport default class Parcel implements BossSerializable {\n paymentBin: Uint8Array;\n payloadBin: Uint8Array;\n hashId: HashId;\n\n payment: TransactionPack;\n payload: TransactionPack;\n\n constructor(\n payment: Uint8Array,\n payload: Uint8Array,\n hashId: HashId\n ) {\n this.paymentBin = payment;\n this.payloadBin = payload;\n this.payment = boss.load(payment);\n this.payload = boss.load(payload);\n this.hashId = hashId;\n }\n\n static className = \"Parcel\";\n\n serializeToBOSS() {\n return {\n payment: this.paymentBin,\n payload: this.payloadBin,\n hashId: this.hashId\n };\n }\n\n static deserializeFromBOSS(serialized: any) {\n return new Parcel(serialized.payment, serialized.payload, serialized.hashId);\n }\n\n static async create(payment: Uint8Array, payload: Uint8Array) {\n const paymentId = (await HashId.calculate(payment)).composite3;\n const payloadId = (await HashId.calculate(payload)).composite3;\n const composite = new Uint8Array(paymentId.length + payloadId.length);\n composite.set(paymentId);\n composite.set(payloadId, paymentId.length);\n\n const id = await HashId.calculate(composite);\n\n return new Parcel(payment, payload, id);\n }\n\n static async createPayment(\n amount: number,\n upack: TransactionPack,\n options: PaymentOptions = {}\n ) {\n let key = 'transaction_units';\n if (options.isTestnet) key = 'test_transaction_units';\n\n const uOld = upack.contract;\n if (!uOld.binary)\n throw new Error('Can\\'t create payment with draft u pack');\n\n // const balanceBig = new Big(uOld.state.data[key]);\n // const amountBig = new Big(amount);\n // if (amountBig.gt(balanceBig)) throw new Error('not enough U');\n // const balanceNewBig = balanceBig.minus(amountBig);\n\n const balance = uOld.state.data[key];\n if (amount > balance) throw new Error('not enough U');\n const balanceNew = balance - amount;\n\n const uNew = await uOld.createRevision(options.createdAt);\n // uNew.state.data[key] = balanceNewBig.toPrecision();\n uNew.state.data[key] = balanceNew;\n\n // FIXME: should move to other place\n uNew.capsule.contract.setCreatorTo('owner');\n uNew.packData();\n\n return new TransactionPack(uNew.pack(), { subItems: [uOld.binary]});\n }\n\n pack() {\n return boss.dump(this);\n }\n\n static unpack(bin: Uint8Array): Parcel {\n return boss.load(bin) as Parcel;\n }\n}\n\nboss.register(\"Parcel\", Parcel);\n","import {\n PublicKey,\n BossSerializable\n} from 'unicrypto';\nimport BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\n\nimport { Primitive, Dict, omitBOSS } from '../utils';\n\nexport default class KeyRecord implements BossSerializable {\n keyPacked: Uint8Array;\n keyLoader: Promise<PublicKey>;\n key: PublicKey | null = null;\n extra: Dict = {};\n\n constructor(keyPacked: Uint8Array, extra?: Dict, key?: PublicKey) {\n this.keyPacked = keyPacked;\n\n if (key) {\n this.key = key;\n this.keyLoader = new Promise(resolve => resolve(key));\n }\n else this.keyLoader = PublicKey.unpack(keyPacked);\n\n if (extra) this.extra = extra;\n }\n\n async getKey() {\n if (this.key) return this.key;\n\n return await this.keyLoader;\n }\n\n setExtra(extra: Dict) { this.extra = extra; }\n\n static create(key: PublicKey, extra: Dict = {}) {\n return new KeyRecord(key.packed, extra, key);\n }\n\n static className = \"KeyRecord\";\n\n serializeToBOSS() {\n const key = {\n '__t': 'RSAPublicKey',\n 'packed': this.keyPacked\n };\n\n return Object.assign({ key }, this.extra);\n }\n\n static deserializeFromBOSS(serialized: any): KeyRecord {\n return new KeyRecord(serialized.key.packed, omitBOSS(serialized, ['key']));\n }\n\n pack() {\n return boss.dump(this);\n }\n\n static unpack(bin: Uint8Array): KeyRecord {\n return boss.load(bin) as KeyRecord;\n }\n}\n\nboss.register(\"KeyRecord\", KeyRecord);\n","const fs = require('fs');\n\nimport { PublicKey, KeyAddress } from 'unicrypto';\n\nexport type Primitive = string | number | Date | null | undefined;\nexport type Dict = { [key: string]: Primitive | Dict };\n\nexport interface RetryOptions {\n attempts?: number,\n interval?: number,\n exponential?: boolean,\n onError?: any\n};\n\nexport async function retry(fn: any, options?: RetryOptions): Promise<any> {\n const opts = options || {};\n let attempts = 5;\n if (typeof opts.attempts === 'number') attempts = opts.attempts;\n\n const interval = opts.interval || 1000;\n const exponential = opts.exponential || false;\n const onError = opts.onError;\n\n try {\n const val = await fn();\n\n return val;\n } catch (error) {\n if (error instanceof Canceled) throw error;\n if (onError) onError(error);\n\n if (attempts) {\n await new Promise(r => setTimeout(r, interval));\n\n return retry(fn, {\n attempts: attempts - 1,\n interval: exponential ? interval * 2 : interval,\n exponential,\n onError\n });\n } else throw new Error('Maximum attempts reached');\n }\n}\n\nexport function abortable(responsePromise: Promise<any>, request: any) {\n return cancelable(responsePromise, () => {\n const activeRequest = typeof request === 'function' ? request() : request;\n if (typeof activeRequest?.cancel === 'function') activeRequest.cancel();\n else if (typeof activeRequest?.abort === 'function') activeRequest.abort();\n });\n}\n\nexport class Canceled extends Error {\n constructor(reason: string = \"\") {\n super(reason);\n Object.setPrototypeOf(this, Canceled.prototype);\n }\n}\n\nexport interface Cancelable<T> extends Promise<T> {\n cancel(): Cancelable<T>;\n}\n\nfunction cancelable<T>(\n promise: Promise<T>,\n onCancel?: () => void\n): Cancelable<T> {\n let cancel: (() => Cancelable<T>) | null = null;\n let cancelable: Cancelable<T>;\n cancelable = <Cancelable<T>>new Promise((resolve, reject) => {\n cancel = () => {\n try { if (onCancel) onCancel(); }\n catch (e) { reject(e); }\n\n reject(new Canceled());\n\n return cancelable;\n };\n\n promise.then(resolve, reject);\n });\n\n if (cancel) cancelable.cancel = cancel;\n\n return cancelable;\n}\n\nexport function readJSON(path: string) {\n return new Promise((resolve, reject) => {\n fs.readFile(path, (err: Error, data: string) => {\n if (err) reject(err);\n else resolve(JSON.parse(data));\n });\n });\n}\n\nexport function isSuperset(set: Set<string>, subset: Set<string>) {\n // FIXME: Set is not defined properly in TS\n for (var elem of Array.from(subset.values())) {\n if (!set.has(elem)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function createAddressSet(\n keys: Array<PublicKey> = [],\n addresses: Array<KeyAddress> = []\n) {\n const addrs: Set<string> = new Set();\n\n keys.forEach(key => {\n addrs.add(key.shortAddress.base58);\n addrs.add(key.longAddress.base58);\n });\n\n addresses.forEach(addr => addrs.add(addr.base58));\n\n return addrs;\n}\n\nexport function omitBOSS(serialized: any, fields: Array<string>) {\n if (typeof serialized !== \"object\" || !serialized) return serialized;\n\n const cleaned = Object.assign({}, serialized);\n delete cleaned['__t'];\n delete cleaned['__type'];\n\n fields.forEach(field => delete cleaned[field]);\n\n return cleaned;\n}\n","import {\n KeyAddress,\n PublicKey,\n BossSerializable\n} from 'unicrypto';\n\nimport BossSingleton from '../../boss';\nconst boss = BossSingleton.getInstance();\n\nimport { Role, AvailableForOptions, RoleDictionary } from './role';\nimport KeyRecord from '../key_record';\nimport { isSuperset, createAddressSet } from '../../utils';\n\ninterface RoleSimpleOptions {\n keys?: Array<PublicKey>,\n addresses?: Array<KeyAddress>,\n keyRecords?: Array<KeyRecord>,\n anonIds?: Array<any>\n}\n\nexport default class RoleSimple implements Role, BossSerializable {\n name: string;\n keyRecords: Array<KeyRecord> = [];\n addresses: Array<KeyAddress> = [];\n anonIds: Array<any> = [];\n\n constructor(name: string, options: RoleSimpleOptions) {\n this.name = name;\n\n if (options.addresses) this.addresses = options.addresses;\n if (options.keyRecords) this.keyRecords = options.keyRecords;\n if (options.anonIds) this.anonIds = options.anonIds;\n if (options.keys)\n this.keyRecords = options.keys.map(key => KeyRecord.create(key));\n }\n\n resolve(roles: RoleDictionary, nestedLevel: number = 0) { return this; }\n\n async getSimpleAddress(roles: RoleDictionary = {}, ignoreRefs = true) {\n if (this.keyRecords.length + this.addresses.length > 1) return null;\n\n if (this.keyRecords.length === 1) {\n const key = await this.keyRecords[0].getKey();\n\n return key.shortAddress;\n } else {\n return this.addresses[0];\n }\n }\n\n async availableFor(options: AvailableForOptions) {\n const keyLoaders = this.keyRecords.map(record => record.getKey());\n const roleKeys = await Promise.all(keyLoaders);\n const roleAddresses = createAddressSet(roleKeys, this.addresses);\n const providedAddresses = createAddressSet(options.keys, options.addresses);\n\n return isSuperset(providedAddresses, roleAddresses);\n }\n\n static className = \"RoleSimple\";\n\n serializeToBOSS() {\n return {\n name: this.name,\n keys: this.keyRecords,\n addresses: this.addresses,\n anonIds: this.anonIds\n };\n }\n\n static deserializeFromBOSS(serialized: any): RoleSimple {\n const records: Array<KeyRecord> = serialized.keys || [];\n const addresses: Array<KeyAddress> = serialized.addresses || [];\n\n return new RoleSimple(serialized.name, {\n keyRecords: records,\n addresses: addresses,\n anonIds: serialized.anonIds || []\n });\n }\n}\n\nboss.register(\"SimpleRole\", RoleSimple);\n","import { BossSerializable } from 'unicrypto';\nimport BossSingleton from '../../boss';\nconst boss = BossSingleton.getInstance();\n\nimport { Role, AvailableForOptions, RoleDictionary } from './role';\nimport RoleLink from './role_link';\n\nenum MODES {\n ANY = \"ANY\",\n ALL = \"ALL\",\n QUORUM = \"QUORUM\"\n}\n\ninterface RoleListOptions {\n mode: MODES,\n roleNames?: Array<string>,\n roles?: Array<Role>,\n quorumSize?: number\n}\n\nexport default class RoleList implements Role, BossSerializable {\n name: string;\n mode: MODES;\n roles: Array<Role> = [];\n quorumSize: number = 1;\n\n constructor(name: string, options: RoleListOptions) {\n const { mode, roleNames, roles, quorumSize } = options;\n\n if (!roleNames && !roles)\n throw new Error(\"Array of role names or roles must be provided\");\n\n this.name = name;\n this.mode = mode;\n\n const createLink = (roleName: string) =>\n new RoleLink(`__${name}-${roleName}`, roleName);\n\n if (roles) this.roles = roles;\n if (roleNames) this.roles = roleNames.map(createLink);\n if (quorumSize) this.quorumSize = quorumSize;\n }\n\n static MODES = MODES;\n\n resolve(roles: RoleDictionary = {}, nestedLevel: number = 0) {\n if (nestedLevel >= 100) throw new Error(`Role \"${this.name}\" is circular`);\n\n return new RoleList(this.name, {\n mode: this.mode,\n roles: this.roles.map(role => role.resolve(roles, nestedLevel + 1)),\n quorumSize: this.quorumSize\n });\n }\n\n async getSimpleAddress(roles: RoleDictionary = {}, ignoreRefs = true) {\n if (this.roles.length === 1 && (this.mode !== MODES.QUORUM || this.quorumSize === 1))\n return this.roles[0].getSimpleAddress(roles);\n else\n return null;\n }\n\n async availableFor(options: AvailableForOptions) {\n const finalTarget = this.resolve(options.roles);\n const totalRoles = finalTarget.roles.length;\n\n async function atLeastNPositive(N: number) {\n let counter = 0;\n let i = 0;\n\n while (counter < N && i < totalRoles) {\n const vote = await finalTarget.roles[i].availableFor(options);\n if (vote) counter++;\n i++;\n }\n\n return counter >= N;\n }\n\n switch (this.mode) {\n case MODES.ANY: return await atLeastNPositive(1);\n case MODES.QUORUM: return await atLeastNPositive(this.quorumSize);\n case MODES.ALL: return await atLeastNPositive(totalRoles);\n }\n }\n\n static className = \"RoleList\";\n\n serializeToBOSS() {\n return {\n 'name': this.name,\n 'mode': this.mode,\n 'roles': this.roles,\n 'quorumSize': this.quorumSize\n };\n }\n\n static deserializeFromBOSS(serialized: any): RoleList {\n return new RoleList(serialized.name, {\n mode: serialized.mode,\n roles: serialized.roles,\n quorumSize: serialized.quorumSize\n });\n }\n}\n\nboss.register(\"RoleList\", RoleList);\n","import { BossSerializable } from 'unicrypto';\nimport BossSingleton from '../../boss';\nconst boss = BossSingleton.getInstance();\nimport Permission from './permission';\nimport { Role } from '../roles/role';\n\nexport default class ChangeOwnerPermission extends Permission implements BossSerializable {\n static DefaultName = \"change_owner\";\n static className = \"ChangeOwnerPermission\";\n\n constructor(role: Role, name: string = ChangeOwnerPermission.DefaultName) {\n super(role, {}, name);\n }\n\n static create(roleName: string, name: string = ChangeOwnerPermission.DefaultName) {\n return new ChangeOwnerPermission(this.makeLink(name, roleName), name);\n }\n\n static deserializeFromBOSS(serialized: any): ChangeOwnerPermission {\n return new ChangeOwnerPermission(serialized.role, serialized.name);\n }\n}\n\nboss.register(\"ChangeOwnerPermission\", ChangeOwnerPermission);\n","import { BossSerializable } from 'unicrypto';\nimport BossSingleton from '../../boss';\nconst boss = BossSingleton.getInstance();\nimport { Role, AvailableForOptions } from '../roles/role';\nimport RoleLink from '../roles/role_link';\nimport Permission from './permission';\nimport { omitBOSS } from '../../utils';\n\ntype ModifyPrimitive = null | string | number | Date;\n\ninterface ModifyDataParams {\n fields: { [key: string]: Array<ModifyPrimitive> }\n}\n\nexport default class ModifyDataPermission extends Permission implements BossSerializable {\n params: ModifyDataParams;\n\n static className = \"ModifyDataPermission\";\n static DefaultName = \"modify_data\";\n\n constructor(\n role: Role,\n params: ModifyDataParams,\n name: string = ModifyDataPermission.DefaultName\n ) {\n super(role, params, name);\n\n this.params = params;\n }\n\n static create(\n roleName: string,\n params: ModifyDataParams,\n name: string = ModifyDataPermission.DefaultName\n ) {\n return new ModifyDataPermission(this.makeLink(name, roleName), params, name);\n }\n\n static deserializeFromBOSS(serialized: any): ModifyDataPermission {\n const params = omitBOSS(serialized, ['role', 'name']);\n\n return new ModifyDataPermission(serialized.role, params, serialized.name);\n }\n}\n\nboss.register(\"ModifyDataPermission\", ModifyDataPermission);\n","import { BossSerializable } from 'unicrypto';\nimport BossSingleton from '../../boss';\nconst boss = BossSingleton.getInstance();\nimport { Role, AvailableForOptions } from '../roles/role';\nimport RoleLink from '../roles/role_link';\nimport Permission from './permission';\nimport { omitBOSS } from '../../utils';\n\ninterface ChangeNumberParams {\n field_name: string,\n min_value?: string | number,\n min_step?: string | number,\n max_value?: string | number,\n max_step?: string | number\n}\n\nexport default class ChangeNumberPermission extends Permission implements BossSerializable {\n params: ChangeNumberParams;\n\n static className = \"ChangeNumberPermission\";\n static DefaultName = \"decrement_permission\";\n\n constructor(\n role: Role,\n params: ChangeNumberParams,\n name: string = ChangeNumberPermission.DefaultName\n ) {\n super(role, params, name);\n\n this.params = params;\n }\n\n static create(\n roleName: string,\n params: ChangeNumberParams,\n name: string = ChangeNumberPermission.DefaultName\n ) {\n return new ChangeNumberPermission(this.makeLink(name, roleName), params, name);\n }\n\n static deserializeFromBOSS(serialized: any): ChangeNumberPermission {\n const params = omitBOSS(serialized, ['role', 'name']);\n\n return new ChangeNumberPermission(serialized.role, params, serialized.name);\n }\n}\n\nboss.register(\"ChangeNumberPermission\", ChangeNumberPermission);\n","import { BossSerializable } from 'unicrypto';\nimport BossSingleton from '../../boss';\nconst boss = BossSingleton.getInstance();\nimport { Role, AvailableForOptions } from '../roles/role';\nimport RoleLink from '../roles/role_link';\nimport Permission from './permission';\nimport { omitBOSS } from '../../utils';\n\ninterface SplitJoinParams {\n field_name: string,\n min_value?: string | number,\n min_unit?: string | number,\n join_match_fields: Array<string>\n}\n\nexport default class SplitJoinPermission extends Permission implements BossSerializable {\n params: SplitJoinParams;\n\n static className = \"SplitJoinPermission\";\n static DefaultName = \"split_join\";\n\n constructor(\n role: Role,\n params: SplitJoinParams,\n name: string = SplitJoinPermission.DefaultName\n ) {\n super(role, params, name);\n\n this.params = params;\n }\n\n static create(\n roleName: string,\n params: SplitJoinParams,\n name: string = SplitJoinPermission.DefaultName\n ) {\n return new SplitJoinPermission(this.makeLink(name, roleName), params, name);\n }\n\n static deserializeFromBOSS(serialized: any): SplitJoinPermission {\n const params = omitBOSS(serialized, ['role', 'name']);\n\n return new SplitJoinPermission(serialized.role, params, serialized.name);\n }\n}\n\nboss.register(\"SplitJoinPermission\", SplitJoinPermission);\n","import { abortable } from '../utils';\nimport { Node } from './node';\nimport { PrivateKey, PublicKey, PrivateKeySignOpts, textToBytes } from 'unicrypto';\n\nimport {\n randomBytes,\n encode64,\n SHA,\n SymmetricKey\n} from 'unicrypto';\nimport BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\n\ninterface FetchOpts {\n method: string,\n headers: any,\n body?: string,\n signal: AbortSignal\n}\n\nconst CONNECTION_TIMEOUT = 5000;\nconst CLIENT_VERSION = 3;\n\nexport default class NodeConnection {\n node: Node;\n authKey: PrivateKey;\n nodeURL: string;\n sessionId: number | undefined;\n sessionKey: SymmetricKey | undefined;\n version: number | undefined;\n nodePublicKey: PublicKey | undefined;\n\n constructor(node: Node, authKey: PrivateKey, directConnection?: boolean) {\n this.node = node;\n this.authKey = authKey;\n\n this.nodeURL = node.https;\n if (directConnection) this.nodeURL = node.http;\n }\n\n async connect() {\n const clientNonce = randomBytes(47);\n const signatureOpts: PrivateKeySignOpts = { pssHash: \"sha512\" };\n\n console.log(`setting up protected connection to ${this.nodeURL}`);\n\n const clientKey = await this.authKey.publicKey.pack();\n const connectionData = await this.request(\"connect\", {\n client_key: clientKey,\n client_version: CLIENT_VERSION\n }, { timeout: CONNECTION_TIMEOUT });\n\n this.sessionId = connectionData['session_id'];\n const serverVersion = connectionData['server_version'] || 1;\n\n this.version = Math.min(serverVersion, CLIENT_VERSION);\n\n const authData = boss.dump({\n client_nonce: clientNonce,\n server_nonce: connectionData['server_nonce'],\n client_version: CLIENT_VERSION,\n server_version: serverVersion\n });\n\n const token = await this.request(\"get_token\", {\n data: authData,\n signature: await this.authKey.sign(authData, signatureOpts),\n session_id: this.sessionId\n });\n\n const tokenData = token.data;\n const nodeKey = await this.node.getPublicKey();\n\n if (!nodeKey) throw new Error(\"Node key is undefined\");\n\n const isVerified = await nodeKey.verify(\n tokenData, token.signature, signatureOpts\n );\n\n if (!isVerified) throw new Error(\"bad node signature\");\n\n const params = boss.load(tokenData);\n\n if (encode64(clientNonce) !== encode64(params['client_nonce']))\n throw new Error(\"nonce mismatch, authentication failed\");\n\n const decryptedTokenBin = await this.authKey.decrypt(params['encrypted_token']);\n const decryptedToken = boss.load(decryptedTokenBin);\n\n this.sessionKey = new SymmetricKey({ keyBytes: decryptedToken.sk });\n\n const response = await this.command(\"hello\");\n\n if (response.status !== \"OK\")\n throw new Error(`wrong status ${response.status}, authentication failed`);\n\n console.log(`connected, system says: ${response.message}`);\n\n return this;\n }\n\n async command(name: string, params: any = {}, requestOptions: any = {}) {\n if (!this.sessionKey || !this.version) throw new Error(\"not in session\");\n\n const version = this.version;\n const sk = this.sessionKey;\n const data = boss.dump({ command: name, params });\n let encryptedParams: Uint8Array;\n\n if (version >= 2) encryptedParams = await sk.etaEncrypt(data);\n else encryptedParams = await sk.encrypt(data);\n\n const req = this.request(\"command\", {\n command: \"command\",\n params: encryptedParams,\n session_id: this.sessionId\n }, requestOptions);\n\n return abortable(new Promise((resolve, reject) => {\n req.then(async (response: any) => {\n let decrypted: Uint8Array;\n\n if (version >= 2) decrypted = await sk.etaDecrypt(response.result);\n else decrypted = await sk.decrypt(response.result);\n\n const result = boss.load(decrypted);\n if (result.error) reject(result.error);\n else resolve(result.result);\n }).catch(reject);\n }), req);\n }\n\n request(path: string, params: any = {}, requestOptions: any = {}) {\n const url = `${this.nodeURL}/${path}`;\n const data = { requestData64: encode64(boss.dump(params)) };\n\n return NodeConnection.request(\"POST\", url, { data, ...requestOptions });\n }\n\n static request(method: string, url: string, options: any = {}) {\n const controller = new AbortController();\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n const promise = new Promise((resolve, reject) => {\n let headers = options.headers || {};\n if (method === 'POST') headers = Object.assign({}, headers, {\n 'Content-Type': 'application/json'\n });\n\n let opts: FetchOpts = {\n method,\n headers,\n signal: controller.signal\n };\n\n if (method === 'POST') opts.body = JSON.stringify(options.data);\n\n const fetch = (globalThis as any).fetch;\n if (typeof fetch !== 'function') {\n reject(new Error('Fetch API is not available in this environment'));\n return;\n }\n\n fetch(url, opts).then((res: any) => {\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}${res.statusText ? ` ${res.statusText}` : ''}`);\n }\n return res.blob();\n })\n .then(function (blob: Blob) {\n return blob.arrayBuffer();\n }).then(function (ab: ArrayBuffer) {\n const response = new Uint8Array(ab);\n const answer = boss.load(response);\n\n if (answer && answer.result === \"ok\") resolve(answer.response);\n else reject(answer);\n\n }).catch((err: Error) => reject(err))\n .finally(() => {\n if (timeout !== undefined) clearTimeout(timeout);\n });\n\n if (options.timeout) {\n timeout = setTimeout(() => {\n controller.abort();\n reject(new Error(\"Connection timed out\"));\n }, options.timeout);\n }\n });\n\n return abortable(promise, controller);\n }\n\n static xchangeRequest(method: string, url: string, options: any = {}) {\n const controller = new AbortController();\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n const promise = new Promise((resolve, reject) => {\n let headers = options.headers || {};\n if (method === 'POST') headers = Object.assign({}, headers, {\n 'Content-Type': 'application/json'\n });\n\n let opts: FetchOpts = {\n method,\n headers,\n signal: controller.signal\n };\n\n if (method === 'POST') opts.body = JSON.stringify(options.data);\n\n const fetch = (globalThis as any).fetch;\n if (typeof fetch !== 'function') {\n reject(new Error('Fetch API is not available in this environment'));\n return;\n }\n\n fetch(url, opts).then((res: any) => {\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}${res.statusText ? ` ${res.statusText}` : ''}`);\n }\n return res.json();\n })\n .then(resolve).catch((err: Error) => reject(err))\n .finally(() => {\n if (timeout !== undefined) clearTimeout(timeout);\n });\n\n if (options.timeout) {\n timeout = setTimeout(() => {\n controller.abort();\n reject(new Error(\"Connection timed out\"));\n }, options.timeout);\n }\n });\n\n return abortable(promise, controller);\n }\n}\n","import NodeConnection from './node_connection';\n\nimport {\n PublicKey,\n decode64,\n encode64\n} from 'unicrypto';\nimport BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\n\nfunction rewriteProtocol(value: string, protocol: \"http:\" | \"https:\") {\n const url = new URL(value);\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\")\n throw new Error(`unsupported node URL protocol: ${url.protocol}`);\n\n const oldPort = url.port;\n url.protocol = protocol;\n\n // Universa's traditional topology uses port 8080 for HTTP and 443 for\n // HTTPS. Only translate those exact ports; string replacement used to also\n // corrupt ports such as 80800 and URL paths containing \":8080\".\n if (protocol === \"https:\" && oldPort === \"8080\") url.port = \"443\";\n if (protocol === \"http:\" && oldPort === \"443\") url.port = \"8080\";\n\n return url.toString().replace(/\\/$/, \"\");\n}\n\nfunction validateNodeURL(value: string, nodeName: string, field: string) {\n try {\n const url = new URL(value);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\")\n throw new Error(`unsupported protocol ${url.protocol}`);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`invalid node ${nodeName}: invalid ${field} URL ${value} (${reason})`);\n }\n}\n\nconst forceHTTPS = (url: string) => rewriteProtocol(url, \"https:\");\n\nconst forceHTTP = (url: string) => rewriteProtocol(url, \"http:\");\n\nconst GET_TOPOLOGY_TIMEOUT = 1000;\n\nfunction difference(setA: Set<string>, setB: Set<string>) {\n let _difference = new Set(setA);\n\n setB.forEach((elem) => _difference.delete(elem));\n\n return _difference;\n}\n\nfunction isEqual(setA: Set<string>, setB: Set<string>) {\n if (setA.size !== setB.size) return false;\n\n const diff = difference(setA, setB);\n\n return diff.size === 0;\n}\n\nexport interface NodeInfo {\n name: string,\n number: number,\n domain_urls: Array<string>,\n direct_urls: Array<string>,\n key: Uint8Array | string\n}\n\nexport class Node {\n id: string | undefined;\n key: PublicKey | undefined;\n name: string;\n http: string;\n https: string;\n ready: Promise<void>;\n keyBIN: Uint8Array;\n number: number;\n domainURLs: Set<string>;\n directURLs: Set<string>;\n\n constructor(info: NodeInfo) {\n if (!info || typeof info !== \"object\") throw new Error(\"invalid node: expected an object\");\n if (typeof info.name !== \"string\" || info.name.length === 0)\n throw new Error(\"invalid node: name must be a non-empty string\");\n if (!Number.isInteger(info.number) || info.number < 0)\n throw new Error(`invalid node ${info.name}: number must be a non-negative integer`);\n if (!Array.isArray(info.domain_urls) || info.domain_urls.length === 0 ||\n info.domain_urls.some(url => typeof url !== \"string\" || url.length === 0))\n throw new Error(`invalid node ${info.name}: domain_urls must be a non-empty string array`);\n if (!Array.isArray(info.direct_urls) ||\n info.direct_urls.some(url => typeof url !== \"string\" || url.length === 0))\n throw new Error(`invalid node ${info.name}: direct_urls must be a string array`);\n if (!(typeof info.key === \"string\" && info.key.length > 0) && !(info.key instanceof Uint8Array))\n throw new Error(`invalid node ${info.name}: key must be base64 or Uint8Array`);\n\n info.domain_urls.forEach(url => validateNodeURL(url, info.name, \"domain_urls\"));\n info.direct_urls.forEach(url => validateNodeURL(url, info.name, \"direct_urls\"));\n\n this.name = info.name;\n this.number = info.number;\n this.domainURLs = new Set(info.domain_urls);\n this.directURLs = new Set(info.direct_urls);\n\n let keyBIN = info.key;\n if (typeof keyBIN === \"string\") keyBIN = decode64(keyBIN);\n\n this.keyBIN = keyBIN as Uint8Array;\n\n const self = this;\n\n this.ready = PublicKey.unpack(this.keyBIN).then(key => {\n self.key = key;\n self.id = encode64(key.fingerprint);\n });\n\n const domainURL = this.domainURLs.values().next().value;\n\n if (this.directURLs.size)\n this.http = this.directURLs.values().next().value;\n else\n this.http = forceHTTP(domainURL);\n\n this.https = forceHTTPS(domainURL);\n }\n\n async getId() {\n await this.ready;\n\n return this.id;\n }\n\n async getPublicKey() {\n await this.ready;\n\n return this.key;\n }\n\n async equals(node: Node) {\n await this.ready;\n\n if (node.name !== this.name) return false;\n if (node.number !== this.number) return false;\n if (await node.getId() !== await this.getId()) return false;\n if (!isEqual(this.domainURLs, node.domainURLs)) return false;\n if (!isEqual(this.directURLs, node.directURLs)) return false;\n\n return true;\n }\n\n info() {\n return {\n name: this.name,\n number: this.number,\n domain_urls: Array.from(this.domainURLs),\n direct_urls: Array.from(this.directURLs),\n key: encode64(this.keyBIN)\n };\n }\n\n async getTopology(directConnection?: boolean) {\n await this.ready;\n\n let url = this.https;\n if (directConnection) url = this.http;\n\n const resp = await NodeConnection.request(\"GET\", `${url}/topology`, {\n timeout: GET_TOPOLOGY_TIMEOUT\n });\n const { signature, packed_data: packed } = resp;\n if (!this.key) throw new Error(\"node initialization failed (key is undefined)\");\n const isVerified = await this.key.verifyExtended(signature, packed);\n\n if (!isVerified) throw new Error(\"node signature mismatch\");\n\n return boss.load(packed);\n }\n}\n","import { Node, NodeInfo } from './node';\n\nconst randomIndex = (arrayLength: number) => ~~(arrayLength * Math.random());\n\ntype NodeDictionary = { [id: string]: Node };\n\ninterface PackedTopology {\n list: Array<NodeInfo>;\n updated: number;\n}\n\ntype TopologyInput = PackedTopology | Array<NodeInfo>;\n\nexport default class Topology {\n nodes: NodeDictionary;\n updatedAt: Date;\n\n constructor(nodes: NodeDictionary, updatedAt: Date) {\n this.nodes = nodes;\n this.updatedAt = updatedAt;\n }\n\n async update(directConnection?: boolean) {\n const trustLevel = 0.4;\n const self = this;\n const confirmed: { [id: string]: any } = {};\n const failed: { [id: string]: boolean } = {};\n\n interface NodeCount {\n count: number,\n node: Node\n };\n\n const stats: { [id: string]: Array<NodeCount> } = {};\n\n async function addStats(nodes: Array<Node>) {\n const queue = nodes.map(async (node) => {\n const nodeId = await node.getId();\n if (!nodeId) return;\n\n if (!stats[nodeId]) stats[nodeId] = [];\n\n let found = false;\n\n const queue = stats[nodeId].map(async (stat, i) => {\n if (await stat.node.equals(node)) {\n found = true;\n stats[nodeId][i].count++;\n }\n });\n\n return Promise.all(queue).then(() => {\n if (!found) stats[nodeId].push({ count: 1, node });\n });\n });\n\n return Promise.all(queue);\n }\n\n function buildFinal(trustLevel: number) {\n const nodes: { [id: string]: Node } = {};\n const confirmedCount = Object.keys(confirmed).length;\n\n for (var id in stats) {\n const list = stats[id];\n\n let trusted;\n\n if (trustLevel !== 0)\n trusted = list.find(n => confirmedCount > 0 && n.count/confirmedCount >= trustLevel);\n else {\n const maximum = Math.max.apply(null, list.map(n => n.count));\n trusted = list.find(n => n.count === maximum);\n }\n\n if (trusted) nodes[id] = trusted.node;\n }\n\n return nodes;\n }\n\n function colloquium(trustLevel: number, nodesToAsk?: NodeDictionary) {\n return new Promise((resolve, reject) => {\n let Nt = Math.ceil(self.size() * trustLevel);\n if (Nt < 1) Nt = 1;\n let resultFound = false;\n const source = nodesToAsk || self.nodes;\n const ids = Object.keys(source);\n\n function success() {\n if (resultFound) return;\n\n resultFound = true;\n resolve({ failed, confirmed });\n }\n\n function failure(err: Error) {\n if (resultFound) return;\n\n resultFound = true;\n reject(err);\n }\n\n function processNext() {\n if (resultFound) return;\n\n const id = ids.pop();\n id && processNode(id);\n }\n\n async function processNode(id: string) {\n if (resultFound) return;\n\n try {\n const response = await source[id].getTopology(directConnection);\n await processResponse(id, response);\n } catch(err) {\n // console.log(\"On topology request: \", err);\n failed[id] = true;\n if (ids.length > 0) processNext();\n else failure(new Error(\"confirmed responses < 40%\"));\n }\n }\n\n async function processResponse(id: string, resp: any) {\n if (resultFound) return;\n\n const responseNodes: Array<NodeInfo> = resp.nodes;\n const responseTopology = await Topology.load({\n list: responseNodes,\n updated: Math.floor(Date.now() / 1000)\n });\n\n await addStats(Object.values(responseTopology.nodes));\n confirmed[id] = resp;\n delete failed[id];\n\n if (Object.keys(confirmed).length >= Nt) success();\n }\n\n for (var i = 0; i < Nt; i++) {\n const idToProcess = ids.pop();\n idToProcess && processNode(idToProcess);\n }\n });\n }\n\n try {\n await colloquium(0.4);\n } catch(err) {\n\n const tempResult = buildFinal(0);\n for (var id in tempResult) if (!failed[id]) delete tempResult[id];\n\n await colloquium(0.4, tempResult);\n }\n\n this.nodes = buildFinal(0.9);\n this.updatedAt = new Date();\n }\n\n size() { return Object.keys(this.nodes).length; }\n\n pack() {\n const list: Array<any> = [];\n for (var id in this.nodes) list.push(this.nodes[id].info());\n\n const updatedSec = (this.updatedAt.getTime()/1000).toString();\n\n return {\n list,\n updated: parseInt(updatedSec)\n };\n }\n\n getRandomNode() {\n return this.getNode(this.getRandomNodeId());\n }\n\n getRandomNodeId() {\n const ids = Object.keys(this.nodes);\n return ids[randomIndex(ids.length)];\n }\n\n getNode(id: string) {\n return this.nodes[id];\n }\n\n static async load(input: TopologyInput): Promise<Topology>;\n static async load(input: unknown): Promise<Topology>;\n static async load(input: unknown) {\n const packed: any = input;\n const isRawList = Array.isArray(packed);\n if (!isRawList && (!packed || typeof packed !== \"object\" || !Array.isArray(packed.list)))\n throw new Error(\"invalid topology: expected a node array or an object with a list array\");\n\n const list: Array<NodeInfo> = isRawList ? packed : packed.list;\n if (list.length === 0) throw new Error(\"invalid topology: node list is empty\");\n\n let updatedAt: Date;\n if (isRawList) {\n updatedAt = new Date();\n } else {\n if (typeof packed.updated !== \"number\" || !Number.isFinite(packed.updated) || packed.updated < 0)\n throw new Error(\"invalid topology: updated must be a non-negative Unix timestamp\");\n updatedAt = new Date(packed.updated * 1000);\n }\n\n const nodes: { [id: string]: Node } = {};\n\n const loaded = await Promise.all(list.map(async (info) => {\n const node = new Node(info);\n const nodeId = await node.getId();\n if (!nodeId) throw new Error(\"invalid node\");\n return { node, nodeId };\n }));\n\n const names = new Set<string>();\n const numbers = new Set<number>();\n for (const { node, nodeId } of loaded) {\n if (nodes[nodeId]) throw new Error(`invalid topology: duplicate node key (${node.name})`);\n if (names.has(node.name)) throw new Error(`invalid topology: duplicate node name ${node.name}`);\n if (numbers.has(node.number)) throw new Error(`invalid topology: duplicate node number ${node.number}`);\n\n nodes[nodeId] = node;\n names.add(node.name);\n numbers.add(node.number);\n }\n\n return new Topology(nodes, updatedAt);\n }\n}\n","/**\n * Simple and fast stats: mean, S2, stdev (estimated standard deviation).\n * Parsec uses it for clock synchronization which is often used in its\n * application protocols.\n *\n * It uses effective estimation algorithms that do not store the whole series\n * so could be same effective used with tiny arrays and large streams of samples.\n */\nexport class Estimator {\n #sx: number;\n #sx2: number;\n #n: number;\n\n constructor() {\n this.#sx = 0;\n this.#sx2 = 0;\n this.#n = 0;\n }\n\n /**\n * Current number of samples\n */\n get count() {\n return this.#n;\n }\n\n /**\n * current mean value\n */\n get mean() {\n return this.#sx / this.#n;\n }\n\n /**\n * Current Sample Variance estimation, e.g. 𝛔²(n-1)\n */\n get s2() {\n const n = this.#n;\n const m = this.mean;\n return (this.#sx2 - n * m * m) / (n - 1);\n }\n\n /**\n * Estimated standard deviation, √𝛔² (square root of sample variance estimation)\n */\n get stdev() {\n return Math.sqrt(this.s2);\n }\n\n /**\n * Add next sample to series.\n *\n * @param x value to add.\n */\n addSample(x: number) {\n this.#sx += x;\n this.#sx2 += (x * x);\n this.#n++;\n }\n\n /**\n * clear current series so it can restart calulation\n */\n clear() {\n this.#sx = this.#sx2 = this.#n = 0;\n }\n\n toString() {\n return `(${this.mean} ± ${this.stdev.toPrecision(3)})`;\n }\n}\n","import { Node } from './node';\nimport Topology from './topology';\nimport { retry, abortable, readJSON, Cancelable } from '../utils';\nimport NodeConnection from './node_connection';\nimport TransactionPack from '../models/transaction_pack';\nimport Parcel from '../models/parcel';\nimport HashId from '../models/hash_id';\nimport { Estimator } from './estimator';\n\nimport {\n decode64,\n encode64,\n PrivateKey\n} from 'unicrypto';\nimport BossSingleton from '../boss';\nconst boss = BossSingleton.getInstance();\n\nconst CHECK_CONTRACT_TIMEOUT = 2000;\n\nfunction createHashId(id: Uint8Array) {\n return {\n __type: \"HashId\",\n composite3: id\n };\n}\n\nfunction sleep(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\ninterface NetworkOptions {\n topologyKey?: string,\n topology?: Topology,\n topologyFile?: string,\n directConnection?: boolean\n}\n\ninterface ContractState {\n isApproved: boolean,\n isTestnet: boolean,\n states: any\n}\n\nexport interface NetworkApproval {\n id: Uint8Array;\n meanTime: Date;\n stdevSeconds: number;\n trustLevel: number;\n}\n\ninterface ParcelState {\n payment: ItemResult,\n payload: ItemResult\n}\n\ninterface ItemResult {\n createdAt: Date | null,\n extra: any,\n __type: string,\n isTestnet: boolean,\n state: string,\n haveCopy: boolean,\n lockedById: any,\n expiresAt: Date | null,\n errors: any\n}\n\ninterface ItemResultResponse {\n itemResult: ItemResult\n}\n\ntype ConnectionDict = { [id: string]: NodeConnection };\n\nexport default class Network {\n options: NetworkOptions;\n connections: ConnectionDict;\n topologyKey: string;\n directConnection: boolean;\n ready: Promise<void>;\n authKey: PrivateKey;\n setReady: any;\n rejectReady: any;\n topology: Topology | undefined;\n timeOffset: number | null;\n timeUpdatedAt: number | null;\n private readyState: 'pending' | 'fulfilled' | 'rejected';\n private connecting: Promise<this> | null;\n\n constructor(privateKey: PrivateKey, options?: NetworkOptions) {\n this.options = options || {};\n this.connections = {};\n this.topologyKey = this.options.topologyKey || \"__universa_topology\";\n this.directConnection = this.options.directConnection || false;\n this.readyState = 'pending';\n this.connecting = null;\n this.resetReady();\n this.authKey = privateKey;\n this.timeOffset = null;\n this.timeUpdatedAt = null;\n }\n\n private resetReady() {\n this.readyState = 'pending';\n this.ready = new Promise<void>((resolve, reject) => {\n this.setReady = resolve;\n this.rejectReady = reject;\n });\n\n // `connect()` also returns the failure, so `ready` may have no direct\n // consumer. Mark it handled without changing what its consumers observe.\n this.ready.catch(() => undefined);\n }\n\n size() {\n if (this.topology) return this.topology.size();\n\n throw new Error(\"You need to connect before accessing size\");\n }\n\n async getLastTopology() {\n if (typeof window !== 'undefined') {\n const bin = localStorage.getItem(this.topologyKey);\n\n if (bin) {\n return Topology.load(boss.load(decode64(bin)));\n }\n }\n\n if (this.options.topology) return this.options.topology;\n\n if (this.options.topologyFile) {\n const packed = await readJSON(this.options.topologyFile);\n return Topology.load(packed);\n }\n\n throw new Error(\n \"No default topology is bundled in this alpha; provide options.topology or options.topologyFile\"\n );\n }\n\n saveNewTopology() {\n if (typeof window === 'undefined') return;\n\n if (!this.topology) throw new Error(\"Can't save undefined topology\");\n const packed = this.topology.pack();\n localStorage.setItem(this.topologyKey, encode64(boss.dump(packed)));\n }\n\n connect(): Promise<this> {\n if (this.connecting) return this.connecting;\n if (this.readyState !== 'pending') this.resetReady();\n\n this.connecting = this.performConnect();\n return this.connecting;\n }\n\n private async performConnect(): Promise<this> {\n try {\n this.topology = await this.getLastTopology();\n // console.log(`Connecting to the Universa network`);\n await this.topology.update(this.directConnection);\n // console.log(`Loaded network configuration, ${this.size()} nodes`);\n this.saveNewTopology();\n\n if (this.timeOffset === null) {\n try {\n await this.loadNetworkTime();\n } catch (err) {\n // Network time is an optional service and must not prevent access\n // to an otherwise functioning Universa network.\n }\n }\n\n this.readyState = 'fulfilled';\n this.setReady();\n\n return this;\n } catch (err) {\n this.readyState = 'rejected';\n this.rejectReady(err);\n throw err;\n } finally {\n this.connecting = null;\n }\n }\n\n async nodeConnection(nodeId: string) {\n if (!this.topology)\n throw new Error(\"can't establish connection without topology\");\n\n const node = this.topology.getNode(nodeId);\n if (this.connections[nodeId]) return this.connections[nodeId];\n\n await this.ready;\n\n const connection = new NodeConnection(node, this.authKey, this.directConnection);\n await connection.connect();\n this.connections[nodeId] = connection;\n\n return connection;\n }\n\n async getRandomConnection() {\n await this.ready;\n\n if (!this.topology)\n throw new Error(\"can't establish connection without topology\");\n\n return this.nodeConnection(this.topology.getRandomNodeId());\n }\n\n command(\n name: string,\n options?: any,\n connection?: NodeConnection,\n requestOptions?: any\n ) {\n let req: any, conn: NodeConnection;\n\n const run = async () => {\n conn = connection || await this.getRandomConnection();\n\n try {\n req = conn.command(name, options, requestOptions);\n return await req;\n } catch (error) {\n if (!connection) {\n const nodeId = await conn.node.getId();\n if (nodeId) delete this.connections[nodeId];\n }\n throw error;\n }\n };\n\n return abortable(retry(run, {\n attempts: 5,\n interval: 1000,\n onError: (e: Error) => console.log(e, ` send command again`)\n }), () => req);\n }\n\n getState(\n id: HashId | Uint8Array | string,\n connection?: NodeConnection,\n requestOptions?: any) {\n let itemId: Uint8Array;\n if (typeof id === \"string\") itemId = decode64(id);\n else if (id.constructor.name === 'HashId') itemId = (id as HashId).composite3;\n else itemId = id as Uint8Array;\n\n const hashId = createHashId(itemId);\n\n return this.command(\"getState\", { itemId: hashId }, connection, requestOptions || {});\n }\n\n checkParcel(id: Uint8Array | string) {\n let itemId: Uint8Array;\n if (typeof id === \"string\") itemId = decode64(id);\n else itemId = id;\n\n const hashId = createHashId(itemId);\n\n return this.command(\"getParcelProcessingState\", { parcelId: hashId });\n }\n\n checkContract(\n id: HashId | Uint8Array | string,\n trustLevel: number\n ): Promise<NetworkApproval|null> {\n const self = this;\n let itemId: Uint8Array;\n if (typeof id === \"string\") itemId = decode64(id);\n else if (id.constructor.name === 'HashId') itemId = (id as HashId).composite3;\n else itemId = id as Uint8Array;\n\n return new Promise((resolve, reject) => {\n let tLevel = trustLevel;\n if (tLevel > 0.9) tLevel = 0.9;\n\n const size = self.size();\n if (!size) throw new Error(\"missing topology\");\n\n let Nt = Math.ceil(size * tLevel);\n if (Nt < 1) Nt = 1;\n const N10 = (Math.floor(size * 0.1)) + 1;\n const Nn = Math.max(Nt + 1, N10);\n\n let resultFound = false;\n\n let createdAtList: Array<Date> = [];\n let positive = 0;\n let negative = 0;\n let states: { [st: string]: number } = {};\n let isTestnet: boolean;\n\n const requests: Array<Cancelable<any>> = [];\n if (!self.topology) throw new Error(\"missing topology\");\n const ids = Object.keys(self.topology.nodes);\n\n const isPending = (state: string) =>\n state.indexOf(\"PENDING\") === 0 || state.indexOf(\"LOCKED\") === 0;\n\n function success(status: boolean) {\n if (resultFound) return;\n\n resultFound = true;\n\n if (!status) return resolve(null);\n\n const createdAtMs = createdAtList.map(d => d.getTime());\n const meanT = createdAtMs.reduce((p, n) => p + n) / createdAtMs.length;\n const meanTime = new Date(meanT);\n\n const estimator = new Estimator();\n createdAtMs.forEach(c => estimator.addSample(c / 1000));\n\n const result: NetworkApproval = {\n id: itemId,\n meanTime,\n stdevSeconds: estimator.stdev,\n trustLevel: Nn / size\n };\n\n resolve(result);\n }\n\n function failure(err: Error) {\n if (resultFound) return;\n\n resultFound = true;\n reject(err);\n }\n\n function processNext() {\n if (!resultFound && ids.length > 0) {\n const id = ids.pop();\n id && processNode(id);\n } else failure(new Error(\"not enough responses to find consensus\"));\n }\n\n function processVote(itemResult: ItemResult, nodeId: string) {\n if (resultFound) return;\n const { state } = itemResult;\n if (isPending(state)) return ids.unshift(nodeId);\n\n if (!states[state]) states[state] = 1;\n else states[state] += 1;\n\n if (state === \"APPROVED\") {\n positive++;\n if (itemResult.createdAt) createdAtList.push(itemResult.createdAt);\n if (positive >= Nt) return success(true);\n }\n else {\n negative++;\n if (negative >= N10) return success(false);\n }\n\n if (positive + negative >= Nt) processNext();\n }\n\n async function processNode(nodeId: string) {\n if (resultFound) return;\n\n try {\n const conn = await self.nodeConnection(nodeId);\n if (resultFound) return;\n\n const req = self.getState(id, conn, {\n timeout: CHECK_CONTRACT_TIMEOUT\n });\n requests.push(req);\n const response = await req;\n const { itemResult } = response;\n\n isTestnet = itemResult.isTestnet;\n\n processVote(itemResult, nodeId);\n } catch (err) {\n console.log(\"On check contract: \", err);\n if (ids.length > 0) processNext();\n else failure(new Error(\"not enough responses\"));\n }\n }\n\n for (let i = 0; i < Nt; i++) processNext();\n });\n }\n\n isApprovedExtended(\n id: Uint8Array | string,\n trustLevel: number,\n onNodeResponse?: (response: any) => void\n ): Promise<ContractState> {\n const self = this;\n\n return new Promise((resolve, reject) => {\n let tLevel = trustLevel;\n if (tLevel > 0.9) tLevel = 0.9;\n\n // const end = new Date((new Date()).getTime() + millisToWait).getTime();\n const size = self.size();\n if (!size) throw new Error(\"missing topology\");\n\n let Nt = Math.ceil(size * tLevel);\n if (Nt < 1) Nt = 1;\n const N10 = (Math.floor(size * 0.1)) + 1;\n const Nn = Math.max(Nt + 1, N10);\n let resultFound = false;\n\n let positive = 0;\n let negative = 0;\n let states: { [st: string]: number } = {};\n let isTestnet: boolean;\n\n const requests: Array<Cancelable<any>> = [];\n if (!self.topology) throw new Error(\"missing topology\");\n const ids = Object.keys(self.topology.nodes);\n\n const isPending = (state: string) =>\n state.indexOf(\"PENDING\") === 0 || state.indexOf(\"LOCKED\") === 0;\n\n function success(status: boolean) {\n if (resultFound) return;\n\n resultFound = true;\n\n resolve({\n isApproved: status,\n isTestnet,\n states\n });\n }\n\n function failure(err: Error) {\n if (resultFound) return;\n\n resultFound = true;\n reject(err);\n }\n\n function processNext() {\n if (!resultFound && ids.length > 0) {\n const id = ids.pop();\n id && processNode(id);\n } else failure(new Error(\"not enough responses to find consensus\"));\n }\n\n function processVote(state: string, nodeId: string) {\n if (resultFound) return;\n if (isPending(state)) return ids.unshift(nodeId);\n\n if (!states[state]) states[state] = 1;\n else states[state] += 1;\n\n if (state === \"APPROVED\") {\n positive++;\n if (positive >= Nt) return success(true);\n }\n else {\n negative++;\n if (negative >= N10) return success(false);\n }\n\n if (positive + negative >= Nt) processNext();\n }\n\n async function processNode(nodeId: string) {\n if (resultFound) return;\n\n try {\n const conn = await self.nodeConnection(nodeId);\n if (resultFound) return;\n\n const req = self.getState(id, conn, {\n timeout: CHECK_CONTRACT_TIMEOUT\n });\n requests.push(req);\n const response = await req;\n const { itemResult } = response;\n // console.log(itemResult);\n\n if (onNodeResponse) onNodeResponse({ nodeId, itemResult });\n\n isTestnet = itemResult.isTestnet;\n\n processVote(itemResult.state, nodeId);\n } catch (err) {\n console.log(\"On check contract: \", err);\n if (ids.length > 0) processNext();\n else failure(new Error(\"not enough responses\"));\n }\n }\n\n for (let i = 0; i < Nt; i++) processNext();\n });\n }\n\n isApproved(id: Uint8Array | string, trustLevel: number): Promise<boolean> {\n return this.isApprovedExtended(id, trustLevel).then(result => result.isApproved);\n }\n\n now() {\n if (this.timeOffset === null)\n throw new Error('you should load network time before');\n\n const localTime = Date.now();\n\n return new Date(localTime + this.timeOffset);\n }\n\n async loadNetworkTime() {\n const url = 'https://xchange.mainnetwork.io/api/v1/utc';\n const response = await NodeConnection.xchangeRequest('GET', url, { timeout: 3000 });\n const uTime = response.currentEpochSecond * 1000;\n const localTime = Date.now();\n\n this.timeOffset = uTime - localTime;\n this.timeUpdatedAt = localTime;\n }\n\n static async getCost(tpack: TransactionPack) {\n const url = 'https://xchange.mainnetwork.io/api/v1/contracts/cost';\n const binary = await tpack.pack();\n const data = { packedContract: encode64(binary) };\n\n return NodeConnection.xchangeRequest('POST', url, { data });\n }\n\n async registerParcel(parcel: Parcel): Promise<ParcelState> {\n const self = this;\n\n const packedItem = boss.dump(parcel);\n const connection = await this.getRandomConnection();\n\n const paymentId = await parcel.payment.contract.hashId();\n const payloadId = await parcel.payload.contract.hashId();\n\n if (!paymentId || !payloadId) throw new Error('payment or payload wasn\\'t saved!');\n\n let response, error;\n\n try {\n response = await this.command('approveParcel',\n { packedItem },\n connection,\n { timeout: 3000 }\n );\n } catch (err) {\n error = err;\n\n return this.registerParcel(parcel);\n }\n\n const paymentState = await finalState(paymentId);\n const payloadState = await finalState(payloadId);\n\n return {\n payment: paymentState,\n payload: payloadState\n };\n\n async function finalState(id: HashId): Promise<ItemResult> {\n async function check(response: ItemResultResponse) {\n const { itemResult } = response;\n const { state } = itemResult;\n\n // console.log(state);\n\n if (!state.startsWith(\"PENDING\")) return itemResult;\n\n await sleep(100);\n\n return await finalState(id);\n }\n\n const response = await self.getState(id, connection);\n\n return await check(response);\n }\n }\n}\n"],"mappings":"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","names":["import_unicrypto","boss","boss","boss","boss","boss","import_unicrypto","import_unicrypto","boss","hashId","boss","import_unicrypto","boss","hashId","tag","hashId","boss","hashId","import_unicrypto","cancelable","boss","boss","boss","MODES","boss","boss","boss","boss","import_unicrypto","boss","import_unicrypto","boss","queue","trustLevel","id","import_unicrypto","boss","hashId","id","response"]}