common.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { DatabaseManager, SubstrateEvent } from '@dzlzv/hydra-common'
  2. import { Network } from 'query-node/dist/src/modules/enums/enums'
  3. import { Event } from 'query-node/dist/src/modules/event/event.model'
  4. import { Bytes } from '@polkadot/types'
  5. import { WorkingGroup, WorkerId } from '@joystream/types/augment/all'
  6. import { Worker } from 'query-node/dist/model'
  7. import { BaseModel } from 'warthog'
  8. export const CURRENT_NETWORK = Network.OLYMPIA
  9. export function genericEventFields(substrateEvent: SubstrateEvent): Partial<BaseModel & Event> {
  10. const { blockNumber, indexInBlock, extrinsic, blockTimestamp } = substrateEvent
  11. const eventTime = new Date(blockTimestamp)
  12. return {
  13. createdAt: eventTime,
  14. updatedAt: eventTime,
  15. id: `${CURRENT_NETWORK}-${blockNumber}-${indexInBlock}`,
  16. inBlock: blockNumber,
  17. network: CURRENT_NETWORK,
  18. inExtrinsic: extrinsic?.hash,
  19. indexInBlock,
  20. }
  21. }
  22. type AnyMessage<T> = T & {
  23. toJSON(): Record<string, unknown>
  24. }
  25. type AnyMetadataClass<T> = {
  26. name: string
  27. decode(binary: Uint8Array): AnyMessage<T>
  28. encode(obj: T): { finish(): Uint8Array }
  29. toObject(obj: AnyMessage<T>): Record<string, unknown>
  30. }
  31. export function deserializeMetadata<T>(metadataType: AnyMetadataClass<T>, metadataBytes: Bytes): T | null {
  32. try {
  33. // We use `toObject()` to get rid of .prototype defaults for optional fields
  34. return metadataType.toObject(metadataType.decode(metadataBytes.toU8a(true))) as T
  35. } catch (e) {
  36. console.error(`Cannot deserialize ${metadataType.name}! Provided bytes: (${metadataBytes.toHex()})`)
  37. return null
  38. }
  39. }
  40. export function bytesToString(b: Bytes): string {
  41. return (
  42. Buffer.from(b.toU8a(true))
  43. .toString()
  44. // eslint-disable-next-line no-control-regex
  45. .replace(/\u0000/g, '')
  46. )
  47. }
  48. export function perpareString(s: string): string {
  49. // eslint-disable-next-line no-control-regex
  50. return s.replace(/\u0000/g, '')
  51. }
  52. export function hasValuesForProperties<
  53. T extends Record<string, unknown>,
  54. P extends keyof T & string,
  55. PA extends readonly P[]
  56. >(obj: T, props: PA): obj is T & { [K in PA[number]]: NonNullable<K> } {
  57. props.forEach((p) => {
  58. if (obj[p] === null || obj[p] === undefined) {
  59. return false
  60. }
  61. })
  62. return true
  63. }
  64. export type WorkingGroupModuleName =
  65. | 'storageWorkingGroup'
  66. | 'contentDirectoryWorkingGroup'
  67. | 'forumWorkingGroup'
  68. | 'membershipWorkingGroup'
  69. export function getWorkingGroupModuleName(group: WorkingGroup): WorkingGroupModuleName {
  70. if (group.isContent) {
  71. return 'contentDirectoryWorkingGroup'
  72. } else if (group.isMembership) {
  73. return 'membershipWorkingGroup'
  74. } else if (group.isForum) {
  75. return 'forumWorkingGroup'
  76. } else if (group.isStorage) {
  77. return 'storageWorkingGroup'
  78. }
  79. throw new Error(`Unsupported working group: ${group.type}`)
  80. }
  81. export async function getWorker(
  82. store: DatabaseManager,
  83. groupName: WorkingGroupModuleName,
  84. runtimeId: WorkerId | number
  85. ): Promise<Worker> {
  86. const workerDbId = `${groupName}-${runtimeId}`
  87. const worker = await store.get(Worker, { where: { id: workerDbId } })
  88. if (!worker) {
  89. throw new Error(`Worker not found by id ${workerDbId}`)
  90. }
  91. return worker
  92. }