common.ts 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { 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, ProposalId, ThreadId } from '@joystream/types/augment/all'
  6. import { BaseModel } from 'warthog'
  7. export const CURRENT_NETWORK = Network.OLYMPIA
  8. // FIXME: See issues like: https://github.com/Joystream/joystream/issues/2457
  9. type MappingsMemoryCache = {
  10. lastCreatedProposalId?: ProposalId
  11. lastCreatedProposalThreadId?: ThreadId
  12. }
  13. export const MemoryCache: MappingsMemoryCache = {}
  14. export function genericEventFields(substrateEvent: SubstrateEvent): Partial<BaseModel & Event> {
  15. const { blockNumber, indexInBlock, extrinsic, blockTimestamp } = substrateEvent
  16. const eventTime = new Date(blockTimestamp)
  17. return {
  18. createdAt: eventTime,
  19. updatedAt: eventTime,
  20. id: `${CURRENT_NETWORK}-${blockNumber}-${indexInBlock}`,
  21. inBlock: blockNumber,
  22. network: CURRENT_NETWORK,
  23. inExtrinsic: extrinsic?.hash,
  24. indexInBlock,
  25. }
  26. }
  27. type AnyMessage<T> = T & {
  28. toJSON(): Record<string, unknown>
  29. }
  30. type AnyMetadataClass<T> = {
  31. name: string
  32. decode(binary: Uint8Array): AnyMessage<T>
  33. encode(obj: T): { finish(): Uint8Array }
  34. toObject(obj: AnyMessage<T>): Record<string, unknown>
  35. }
  36. export function deserializeMetadata<T>(metadataType: AnyMetadataClass<T>, metadataBytes: Bytes): T | null {
  37. try {
  38. // We use `toObject()` to get rid of .prototype defaults for optional fields
  39. return metadataType.toObject(metadataType.decode(metadataBytes.toU8a(true))) as T
  40. } catch (e) {
  41. console.error(`Cannot deserialize ${metadataType.name}! Provided bytes: (${metadataBytes.toHex()})`)
  42. return null
  43. }
  44. }
  45. export function bytesToString(b: Bytes): string {
  46. return (
  47. Buffer.from(b.toU8a(true))
  48. .toString()
  49. // eslint-disable-next-line no-control-regex
  50. .replace(/\u0000/g, '')
  51. )
  52. }
  53. export function perpareString(s: string): string {
  54. // eslint-disable-next-line no-control-regex
  55. return s.replace(/\u0000/g, '')
  56. }
  57. export function hasValuesForProperties<
  58. T extends Record<string, unknown>,
  59. P extends keyof T & string,
  60. PA extends readonly P[]
  61. >(obj: T, props: PA): obj is T & { [K in PA[number]]: NonNullable<K> } {
  62. props.forEach((p) => {
  63. if (obj[p] === null || obj[p] === undefined) {
  64. return false
  65. }
  66. })
  67. return true
  68. }
  69. export type WorkingGroupModuleName =
  70. | 'storageWorkingGroup'
  71. | 'contentDirectoryWorkingGroup'
  72. | 'forumWorkingGroup'
  73. | 'membershipWorkingGroup'
  74. export function getWorkingGroupModuleName(group: WorkingGroup): WorkingGroupModuleName {
  75. if (group.isContent) {
  76. return 'contentDirectoryWorkingGroup'
  77. } else if (group.isMembership) {
  78. return 'membershipWorkingGroup'
  79. } else if (group.isForum) {
  80. return 'forumWorkingGroup'
  81. } else if (group.isStorage) {
  82. return 'storageWorkingGroup'
  83. }
  84. throw new Error(`Unsupported working group: ${group.type}`)
  85. }