-
Notifications
You must be signed in to change notification settings - Fork 350
/
Event.ts
154 lines (130 loc) · 3.79 KB
/
Event.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Copyright 2017-2020 @polkadot/types authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
import { TypeDef } from '../create/types';
import { EventMetadataLatest } from '../interfaces/metadata';
import { EventId } from '../interfaces/system';
import { AnyJson, Constructor, Registry, RegistryMetadataEvent } from '../types';
import Struct from '../codec/Struct';
import Tuple from '../codec/Tuple';
import Null from '../primitive/Null';
/**
* @name EventData
* @description
* Wrapper for the actual data that forms part of an [[Event]]
*/
export class EventData extends Tuple {
readonly #meta: EventMetadataLatest;
readonly #method: string;
readonly #section: string;
readonly #typeDef: TypeDef[];
constructor (registry: Registry, Types: Constructor[], value: Uint8Array, typeDef: TypeDef[], meta: RegistryMetadataEvent, section: string, method: string) {
super(registry, Types, value);
this.#meta = meta as EventMetadataLatest;
this.#method = method;
this.#section = section;
this.#typeDef = typeDef;
}
/**
* @description The wrapped [[EventMetadata]]
*/
public get meta (): EventMetadataLatest {
return this.#meta;
}
/**
* @description The method as a string
*/
public get method (): string {
return this.#method;
}
/**
* @description The section as a string
*/
public get section (): string {
return this.#section;
}
/**
* @description The [[TypeDef]] for this event
*/
public get typeDef (): TypeDef[] {
return this.#typeDef;
}
}
/**
* @name Event
* @description
* A representation of a system event. These are generated via the [[Metadata]] interfaces and
* specific to a specific Substrate runtime
*/
export default class Event extends Struct {
// Currently we _only_ decode from Uint8Array, since we expect it to
// be used via EventRecord
constructor (registry: Registry, _value?: Uint8Array) {
const { DataType, value } = Event.decodeEvent(registry, _value);
super(registry, {
index: 'EventId',
// eslint-disable-next-line sort-keys
data: DataType
}, value);
}
/** @internal */
public static decodeEvent (registry: Registry, value: Uint8Array = new Uint8Array()): { DataType: Constructor<Null> | Constructor<EventData>; value?: { index: Uint8Array; data: Uint8Array } } {
if (!value.length) {
return {
DataType: Null
};
}
const index = value.subarray(0, 2);
return {
DataType: registry.findMetaEvent(index),
value: {
data: value.subarray(2),
index
}
};
}
/**
* @description The wrapped [[EventData]]
*/
public get data (): EventData {
return this.get('data') as EventData;
}
/**
* @description The [[EventId]], identifying the raw event
*/
public get index (): EventId {
return this.get('index') as EventId;
}
/**
* @description The [[EventMetadata]] with the documentation
*/
public get meta (): EventMetadataLatest {
return this.data.meta;
}
/**
* @description The method string identifying the event
*/
public get method (): string {
return this.data.method;
}
/**
* @description The section string identifying the event
*/
public get section (): string {
return this.data.section;
}
/**
* @description The [[TypeDef]] for the event
*/
public get typeDef (): TypeDef[] {
return this.data.typeDef;
}
/**
* @description Converts the Object to to a human-friendly JSON, with additional fields, expansion and formatting of information
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
public toHuman (isExpanded?: boolean): AnyJson {
// FIXME May this human-friendly
return this.toJSON();
}
}