35 lines
1.1 KiB
JavaScript
35 lines
1.1 KiB
JavaScript
import { FEED_INDEX_HEX_LENGTH } from "../types/index.js";
|
|
import { keccak256Hash } from "../utils/hash.js";
|
|
import { hexToBytes, makeHexString } from "../utils/hex.js";
|
|
import { writeUint64BigEndian } from "../utils/uint64.js";
|
|
|
|
function isEpoch(epoch) {
|
|
return typeof epoch === 'object' && epoch !== null && 'time' in epoch && 'level' in epoch;
|
|
}
|
|
|
|
function hashFeedIdentifier(topic, index) {
|
|
return keccak256Hash(hexToBytes(topic), index);
|
|
}
|
|
|
|
function makeSequentialFeedIdentifier(topic, index) {
|
|
const indexBytes = writeUint64BigEndian(index);
|
|
return hashFeedIdentifier(topic, indexBytes);
|
|
}
|
|
|
|
function makeFeedIndexBytes(s) {
|
|
const hex = makeHexString(s, FEED_INDEX_HEX_LENGTH);
|
|
return hexToBytes(hex);
|
|
}
|
|
|
|
export function makeFeedIdentifier(topic, index) {
|
|
if (typeof index === 'number') {
|
|
return makeSequentialFeedIdentifier(topic, index);
|
|
} else if (typeof index === 'string') {
|
|
const indexBytes = makeFeedIndexBytes(index);
|
|
return hashFeedIdentifier(topic, indexBytes);
|
|
} else if (isEpoch(index)) {
|
|
throw new TypeError('epoch is not yet implemented');
|
|
}
|
|
|
|
return hashFeedIdentifier(topic, index);
|
|
} |