{"version":3,"sources":["../../src/registries/web3/service.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItE,OAAO,KAAK,MAAM,qBAAqB;AACvC,OAAO,KAAK,UAAU,aAAyB;AAC/C,OAAO,KAAK,GAAG,sBAAsB;AACrC,OAAO,EAAE,MAAM,OAAO,CAAC;AAQvB,qBAAa,mBAAoB,YAAW,UAAU,CAAC,OAAO;IAC5D,OAAO,CAAC,IAAI,CAAO;IAEnB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAW;gBAEf,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM;IAQ7C,OAAO,CACX,WAAW,EAAE,GAAG,CAAC,WAAW,EAC5B,OAAO,EAAE,GAAG,CAAC,OAAO,EACpB,QAAQ,EAAE,GAAG,GACZ,OAAO,CAAC,GAAG,CAAC;IAIT,aAAa,IAAI,OAAO,CAAC,EAAE,CAAC;IAK5B,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAO3F,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IActC,gBAAgB,CAAC,WAAW,EAAE,EAAE;IAgBhC,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE;IAgBpE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW;wBAEZ,OAAO,CAAC,MAAM,CAAC;2BAyBV,GAAG,CAAC,OAAO,KAAG,OAAO,CAAC,GAAG,CAAC;;CAWxD;AAED,aAAK,mBAAmB,GAAG;IACzB,QAAQ,EAAE,YAAY,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,qBACnB,SAAQ,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC;IAC5C,WAAW;;;OAGR;IAEG,IAAI,CACR,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,mBAAmB,GACjD,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;CAI/B","file":"service.d.ts","sourcesContent":["/**\n * @module \"ethpm/registries/web3\"\n */\n\nimport { URL } from 'url';\nimport * as t from 'io-ts';\nimport { WebsocketProvider as Web3Provider } from 'web3-providers-ws';\nimport Web3 from 'web3';\nimport { Contract } from 'web3-eth-contract/types';\n\nimport * as config from 'ethpm/config';\nimport * as registries from 'ethpm/registries';\nimport * as pkg from 'ethpm/package';\nimport BN from 'bn.js';\nimport PackagesCursor from './cursors/packages';\nimport ReleasesCursor from './cursors/releases';\n\nconst registryManifest = require('./simple/registry.json');\n\nconst PAGE_SIZE = 10;\n\nexport class Web3RegistryService implements registries.Service {\n  private web3: Web3;\n\n  private address: string;\n\n  private registry: Contract;\n\n  constructor(provider: Web3Provider, address: string) {\n    this.web3 = new Web3(provider as any);\n    this.address = address;\n    const registryABI = registryManifest.contractTypes.PackageRegistry.abi;\n    this.registry = new this.web3.eth.Contract(registryABI, this.address);\n  }\n\n  // needs testing\n  async publish(\n    packageName: pkg.PackageName,\n    version: pkg.Version,\n    manifest: URL,\n  ): Promise<any> {\n    await this.registry.methods.release(packageName, version, manifest).send({});\n  }\n\n  async numPackageIds(): Promise<BN> {\n    const numPackages: number = await this.registry.methods.numPackageIds().call();\n    return new BN(numPackages);\n  }\n\n  async getReleaseData(packageName: pkg.PackageName, version: pkg.Version): Promise<pkg.ContentURI> {\n    const releaseId = await this.registry.methods.getReleaseId(packageName, version).call();\n    const releaseData = await this.registry.methods.getReleaseData(releaseId).call();\n    const ipfsHash = releaseData[2];\n    return ipfsHash;\n  }\n\n  async packages(): Promise<pkg.PackageName[]> {\n    const numPackages = await this.numPackageIds();\n    const allPackageIds = await this.getAllPackageIds(numPackages);\n    const cursor = new PackagesCursor(\n      new BN(PAGE_SIZE),\n      numPackages,\n      this.web3,\n      this.registry,\n      allPackageIds,\n    );\n    const unsortedPackages = await Promise.all(Array.from(cursor));\n    return unsortedPackages.sort();\n  }\n\n  async getAllPackageIds(numPackages: BN) {\n    const pageToIds: any = {};\n    let packageCounter = 0;\n    const numPages = numPackages.toNumber() / PAGE_SIZE;\n    for (let i = 0; i <= numPages; i++) {\n      const slice = await this.registry.methods.getAllPackageIds(packageCounter, PAGE_SIZE).call();\n      pageToIds[i] = slice;\n      packageCounter += PAGE_SIZE;\n    }\n    const formattedPageToIds = Object.keys(pageToIds).reduce((result: any, key: string) => {\n      result[key] = pageToIds[key].packageIds;\n      return result;\n    }, {});\n    return formattedPageToIds;\n  }\n\n  async getAllReleaseIds(packageName: pkg.PackageName, numReleases: BN) {\n    const pageToIds: any = {};\n    let releaseCounter = 0;\n    const numPages = numReleases.toNumber() / PAGE_SIZE;\n    for (let i = 0; i <= numPages; i++) {\n      const slice = await this.registry.methods.getAllReleaseIds(packageName, releaseCounter, PAGE_SIZE).call({});\n      pageToIds[i] = slice;\n      releaseCounter += PAGE_SIZE;\n    }\n    const formattedPageToIds = Object.keys(pageToIds).reduce((result: any, key: string) => {\n      result[key] = pageToIds[key].releaseIds;\n      return result;\n    }, {});\n    return formattedPageToIds;\n  }\n\n  package(packageName: pkg.PackageName) {\n    return {\n      releases: async (): Promise<object> => {\n        const count = await this.registry.methods.numReleaseIds(packageName).call();\n        const numReleases = new BN(count);\n        try {\n          numReleases.toNumber()\n        } catch (_) {\n          return {}\n        }\n        const allReleaseIds = await this.getAllReleaseIds(packageName, numReleases);\n        const cursor = new ReleasesCursor(\n          new BN(PAGE_SIZE),\n          numReleases,\n          this.web3,\n          this.registry,\n          packageName,\n          allReleaseIds,\n        );\n        const allReleaseData = await Promise.all(Array.from(cursor));\n        const formattedReleases = allReleaseData.reduce((map: any, obj) => {\n          map[obj.version] = obj.manifestURI;\n          return map;\n        }, {});\n        return formattedReleases;\n      },\n\n      release: async (version: pkg.Version): Promise<URL> => {\n        const releaseId = await this.registry.methods.getReleaseId(packageName, version).call();\n        const releaseData = await this.registry.methods.getReleaseData(releaseId).call();\n        if (releaseData.manifestURI === '') {\n          throw new Error('Package: ' + packageName + \"@\" + version + \" not found.\")\n        } else {\n          return new URL(releaseData[2]);\n        }\n      },\n    };\n  }\n}\n\ntype Web3RegistryOptions = {\n  provider: Web3Provider;\n  registryAddress: string;\n};\n\nexport default class Web3RegistryConnector\n  extends config.Connector<registries.Service> {\n  optionsType = t.interface({\n    provider: t.object,\n    registryAddress: t.string,\n  });\n\n  async init(\n    { provider, registryAddress }: Web3RegistryOptions,\n  ): Promise<registries.Service> {\n    const service = new Web3RegistryService(provider, registryAddress);\n    return service;\n  }\n}\n"]}