media.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { Option, Vec as Vector, BTreeMap, u64, bool, Text, Null } from '@polkadot/types'
  2. import { U8aFixed } from '@polkadot/types/codec'
  3. import { H256 } from '@polkadot/types/interfaces'
  4. import { BlockAndTime, JoyEnum, JoyStructDecorated } from './common'
  5. import { MemberId } from './members'
  6. import { StorageProviderId } from './working-group' // this should be in discovery really
  7. import { randomAsU8a } from '@polkadot/util-crypto'
  8. import { encodeAddress, decodeAddress } from '@polkadot/keyring'
  9. import { RegistryTypes, Registry } from '@polkadot/types/types'
  10. export class ContentId extends U8aFixed implements H256 {
  11. static generate(registry: Registry): ContentId {
  12. // randomAsU8a uses https://www.npmjs.com/package/tweetnacl#random-bytes-generation
  13. return new ContentId(registry, randomAsU8a())
  14. }
  15. static decode(registry: Registry, contentId: string): ContentId {
  16. return new ContentId(registry, decodeAddress(contentId))
  17. }
  18. static encode(contentId: Uint8Array): string {
  19. // console.log('contentId:', Buffer.from(contentId).toString('hex'))
  20. return encodeAddress(contentId)
  21. }
  22. encode(): string {
  23. return ContentId.encode(this)
  24. }
  25. }
  26. export class DataObjectTypeId extends u64 {}
  27. export class DataObjectStorageRelationshipId extends u64 {}
  28. export class VecContentId extends Vector.with(ContentId) {}
  29. export class OptionVecContentId extends Option.with(VecContentId) {}
  30. export const LiaisonJudgementDef = {
  31. Pending: Null,
  32. Accepted: Null,
  33. Rejected: Null,
  34. } as const
  35. export type LiaisonJudgementKey = keyof typeof LiaisonJudgementDef
  36. export class LiaisonJudgement extends JoyEnum(LiaisonJudgementDef) {}
  37. export class DataObject extends JoyStructDecorated({
  38. owner: MemberId,
  39. added_at: BlockAndTime,
  40. type_id: DataObjectTypeId,
  41. size: u64,
  42. liaison: StorageProviderId,
  43. liaison_judgement: LiaisonJudgement,
  44. ipfs_content_id: Text,
  45. }) {
  46. /** Actually it's 'size', but 'size' is already reserved by a parent class. */
  47. get size_in_bytes(): u64 {
  48. return this.get('size') as u64
  49. }
  50. }
  51. export class DataObjectStorageRelationship extends JoyStructDecorated({
  52. content_id: ContentId,
  53. storage_provider: StorageProviderId,
  54. ready: bool,
  55. }) {}
  56. export class DataObjectType extends JoyStructDecorated({
  57. description: Text,
  58. active: bool,
  59. }) {}
  60. export class DataObjectsMap extends BTreeMap.with(ContentId, DataObject) {}
  61. export const mediaTypes: RegistryTypes = {
  62. ContentId,
  63. LiaisonJudgement,
  64. DataObject,
  65. DataObjectStorageRelationshipId,
  66. DataObjectStorageRelationship,
  67. DataObjectTypeId,
  68. DataObjectType,
  69. DataObjectsMap,
  70. }
  71. export default mediaTypes