From fdc39297fdba5e9c7510c8ed9cc00a1183da9c1f Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 26 Aug 2023 13:18:58 -0500 Subject: [PATCH] Add kinds module to classify events by kind --- src/kinds.ts | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/kinds.ts diff --git a/src/kinds.ts b/src/kinds.ts new file mode 100644 index 0000000..33558cb --- /dev/null +++ b/src/kinds.ts @@ -0,0 +1,40 @@ +/** Events are **regular**, which means they're all expected to be stored by relays. */ +function isRegularKind(kind: number) { + return 1000 <= kind && kind < 10000; +} + +/** Events are **replaceable**, which means that, for each combination of `pubkey` and `kind`, only the latest event is expected to (SHOULD) be stored by relays, older versions are expected to be discarded. */ +function isReplaceableKind(kind: number) { + return (10000 <= kind && kind < 20000) || kind == 0 || kind == 3; +} + +/** Events are **ephemeral**, which means they are not expected to be stored by relays. */ +function isEphemeralKind(kind: number) { + return 20000 <= kind && kind < 30000; +} + +/** Events are **parameterized replaceable**, which means that, for each combination of `pubkey`, `kind` and the `d` tag, only the latest event is expected to be stored by relays, older versions are expected to be discarded. */ +function isParameterizedReplaceableKind(kind: number) { + return 30000 <= kind && kind < 40000; +} + +/** Classification of the event kind. */ +type KindClassification = 'regular' | 'replaceable' | 'ephemeral' | 'parameterized' | 'unknown'; + +/** Determine the classification of this kind of event if known, or `unknown`. */ +function classifyKind(kind: number): KindClassification { + if (isRegularKind(kind)) return 'regular'; + if (isReplaceableKind(kind)) return 'replaceable'; + if (isEphemeralKind(kind)) return 'ephemeral'; + if (isParameterizedReplaceableKind(kind)) return 'parameterized'; + return 'unknown'; +} + +export { + classifyKind, + isEphemeralKind, + isParameterizedReplaceableKind, + isRegularKind, + isReplaceableKind, + type KindClassification, +};