-
Notifications
You must be signed in to change notification settings - Fork 458
/
event.ts
113 lines (98 loc) 路 2.77 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
/*
* Copyright 漏 2022 Lisk Foundation
*
* See the LICENSE file at the top-level directory of this distribution
* for licensing information.
*
* Unless otherwise agreed in a custom licensing agreement with the Lisk Foundation,
* no part of this software, including this file, may be copied, modified,
* propagated, or distributed except according to the terms contained in the
* LICENSE file.
*
* Removal or modification of this copyright notice is prohibited.
*/
import { codec } from '@liskhq/lisk-codec';
import { utils } from '@liskhq/lisk-cryptography';
import {
EVENT_TOPIC_HASH_LENGTH_BYTES,
EVENT_TOPIC_INDEX_LENGTH_BITS,
EVENT_TOTAL_INDEX_LENGTH_BYTES,
} from './constants';
import { eventSchema } from './schema';
import { JSONObject } from './types';
export interface EventAttr {
module: string;
name: string;
topics: Buffer[];
index: number;
height: number;
data: Buffer;
}
type EventJSON = JSONObject<EventAttr>;
export class Event {
private _index: number;
private readonly _module: string;
private readonly _name: string;
private readonly _topics: Buffer[];
private readonly _data: Buffer;
private readonly _height: number;
public constructor({ index, module, name, topics, data, height }: EventAttr) {
this._index = index;
this._module = module;
this._name = name;
this._topics = topics;
this._data = data;
this._height = height;
}
public static fromBytes(value: Buffer): Event {
const decoded = codec.decode<EventAttr>(eventSchema, value);
return new Event(decoded);
}
public id(): Buffer {
return utils.hash(codec.encode(eventSchema, this.toObject()));
}
public setIndex(index: number): void {
this._index = index;
}
public getBytes(): Buffer {
return codec.encode(eventSchema, this._getAllProps());
}
public keyPair(): { key: Buffer; value: Buffer }[] {
const result = [];
const value = utils.hash(this.getBytes());
for (let i = 0; i < this._topics.length; i += 1) {
const key = Buffer.concat([
utils.hash(this._topics[i]).subarray(0, EVENT_TOPIC_HASH_LENGTH_BYTES),
this._getIndexBytes(i),
]);
result.push({
key,
value,
});
}
return result;
}
public toJSON(): EventJSON {
return codec.toJSON(eventSchema, this._getAllProps());
}
public toObject(): EventAttr {
return this._getAllProps();
}
private _getIndexBytes(index: number): Buffer {
const indexBytes = Buffer.alloc(EVENT_TOTAL_INDEX_LENGTH_BYTES);
// eslint-disable-next-line no-bitwise
const indexBit = ((this._index << EVENT_TOPIC_INDEX_LENGTH_BITS) >>> 0) + index;
indexBytes.writeUint32BE(indexBit, 0);
return indexBytes;
}
private _getAllProps(): EventAttr {
return {
data: this._data,
index: this._index,
module: this._module,
name: this._name,
topics: this._topics,
height: this._height,
};
}
}