Scenario.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { WsProvider } from '@polkadot/api'
  2. import { ApiFactory } from './Api'
  3. import { QueryNodeApi } from './QueryNodeApi'
  4. import { config } from 'dotenv'
  5. import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client/core'
  6. import { extendDebug, Debugger } from './Debugger'
  7. import { Flow } from './Flow'
  8. import { Job } from './Job'
  9. import { JobManager } from './JobManager'
  10. import { ResourceManager } from './Resources'
  11. import fetch from 'cross-fetch'
  12. export type ScenarioProps = {
  13. env: NodeJS.ProcessEnv
  14. debug: Debugger.Debugger
  15. job: (label: string, flows: Flow[] | Flow) => Job
  16. }
  17. export async function scenario(scene: (props: ScenarioProps) => Promise<void>): Promise<void> {
  18. // Load env variables
  19. config()
  20. const env = process.env
  21. // Connect api to the chain
  22. const nodeUrl: string = env.NODE_URL || 'ws://127.0.0.1:9944'
  23. const provider = new WsProvider(nodeUrl)
  24. const apiFactory = await ApiFactory.create(
  25. provider,
  26. env.TREASURY_ACCOUNT_URI || '//Alice',
  27. env.SUDO_ACCOUNT_URI || '//Alice'
  28. )
  29. const queryNodeUrl: string = env.QUERY_NODE_URL || 'http://127.0.0.1:8081/graphql'
  30. const queryNodeProvider = new ApolloClient({
  31. link: new HttpLink({ uri: queryNodeUrl, fetch }),
  32. // uri: queryNodeUrl,
  33. cache: new InMemoryCache(),
  34. defaultOptions: { query: { fetchPolicy: 'no-cache', errorPolicy: 'all' } },
  35. })
  36. const query = new QueryNodeApi(queryNodeProvider)
  37. const debug = extendDebug('scenario')
  38. const jobs = new JobManager({ apiFactory, query, env })
  39. await scene({ env, debug, job: jobs.createJob.bind(jobs) })
  40. const resources = new ResourceManager()
  41. try {
  42. await jobs.run(resources)
  43. } catch (err) {
  44. console.error(err)
  45. process.exit(-1)
  46. }
  47. // Note: disconnecting and then reconnecting to the chain in the same process
  48. // doesn't seem to work!
  49. apiFactory.close()
  50. }