@nostrify/policies 0.36.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/.turbo/daemon/7bb8240f68f7ad88-turbo.log.2025-07-29 +0 -0
  2. package/.turbo/turbo-build.log +5 -0
  3. package/AntiDuplicationPolicy.test.ts +50 -0
  4. package/AntiDuplicationPolicy.ts +78 -0
  5. package/AnyPolicy.test.ts +57 -0
  6. package/AnyPolicy.ts +21 -0
  7. package/AuthorPolicy.test.ts +23 -0
  8. package/AuthorPolicy.ts +23 -0
  9. package/CHANGELOG.md +66 -0
  10. package/DomainPolicy.test.ts +246 -0
  11. package/DomainPolicy.ts +96 -0
  12. package/FiltersPolicy.test.ts +14 -0
  13. package/FiltersPolicy.ts +27 -0
  14. package/HashtagPolicy.test.ts +34 -0
  15. package/HashtagPolicy.ts +25 -0
  16. package/HellthreadPolicy.test.ts +23 -0
  17. package/HellthreadPolicy.ts +27 -0
  18. package/InvertPolicy.test.ts +19 -0
  19. package/InvertPolicy.ts +17 -0
  20. package/KeywordPolicy.test.ts +28 -0
  21. package/KeywordPolicy.ts +25 -0
  22. package/LICENSE +21 -0
  23. package/NoOpPolicy.test.ts +18 -0
  24. package/NoOpPolicy.ts +9 -0
  25. package/OpenAIPolicy.test.ts +42 -0
  26. package/OpenAIPolicy.ts +113 -0
  27. package/PipePolicy.test.ts +58 -0
  28. package/PipePolicy.ts +36 -0
  29. package/PowPolicy.test.ts +27 -0
  30. package/PowPolicy.ts +41 -0
  31. package/PubkeyBanPolicy.test.ts +17 -0
  32. package/PubkeyBanPolicy.ts +24 -0
  33. package/README.md +34 -0
  34. package/ReadOnlyPolicy.test.ts +19 -0
  35. package/ReadOnlyPolicy.ts +9 -0
  36. package/RegexPolicy.test.ts +17 -0
  37. package/RegexPolicy.ts +22 -0
  38. package/ReplyBotPolicy.test.ts +50 -0
  39. package/ReplyBotPolicy.ts +59 -0
  40. package/SizePolicy.test.ts +21 -0
  41. package/SizePolicy.ts +35 -0
  42. package/WhitelistPolicy.test.ts +17 -0
  43. package/WhitelistPolicy.ts +32 -0
  44. package/WoTPolicy.test.ts +35 -0
  45. package/WoTPolicy.ts +61 -0
  46. package/dist/AntiDuplicationPolicy.d.ts +43 -0
  47. package/dist/AntiDuplicationPolicy.d.ts.map +1 -0
  48. package/dist/AntiDuplicationPolicy.js +63 -0
  49. package/dist/AntiDuplicationPolicy.js.map +1 -0
  50. package/dist/AnyPolicy.d.ts +8 -0
  51. package/dist/AnyPolicy.d.ts.map +1 -0
  52. package/dist/AnyPolicy.js +23 -0
  53. package/dist/AnyPolicy.js.map +1 -0
  54. package/dist/AuthorPolicy.d.ts +9 -0
  55. package/dist/AuthorPolicy.d.ts.map +1 -0
  56. package/dist/AuthorPolicy.js +27 -0
  57. package/dist/AuthorPolicy.js.map +1 -0
  58. package/dist/DomainPolicy.d.ts +21 -0
  59. package/dist/DomainPolicy.d.ts.map +1 -0
  60. package/dist/DomainPolicy.js +68 -0
  61. package/dist/DomainPolicy.js.map +1 -0
  62. package/dist/FiltersPolicy.d.ts +18 -0
  63. package/dist/FiltersPolicy.d.ts.map +1 -0
  64. package/dist/FiltersPolicy.js +30 -0
  65. package/dist/FiltersPolicy.js.map +1 -0
  66. package/dist/HashtagPolicy.d.ts +16 -0
  67. package/dist/HashtagPolicy.d.ts.map +1 -0
  68. package/dist/HashtagPolicy.js +29 -0
  69. package/dist/HashtagPolicy.js.map +1 -0
  70. package/dist/HellthreadPolicy.d.ts +14 -0
  71. package/dist/HellthreadPolicy.d.ts.map +1 -0
  72. package/dist/HellthreadPolicy.js +23 -0
  73. package/dist/HellthreadPolicy.js.map +1 -0
  74. package/dist/InvertPolicy.d.ts +9 -0
  75. package/dist/InvertPolicy.d.ts.map +1 -0
  76. package/dist/InvertPolicy.js +24 -0
  77. package/dist/InvertPolicy.js.map +1 -0
  78. package/dist/KeywordPolicy.d.ts +16 -0
  79. package/dist/KeywordPolicy.d.ts.map +1 -0
  80. package/dist/KeywordPolicy.js +29 -0
  81. package/dist/KeywordPolicy.js.map +1 -0
  82. package/dist/NoOpPolicy.d.ts +6 -0
  83. package/dist/NoOpPolicy.d.ts.map +1 -0
  84. package/dist/NoOpPolicy.js +12 -0
  85. package/dist/NoOpPolicy.js.map +1 -0
  86. package/dist/OpenAIPolicy.d.ts +80 -0
  87. package/dist/OpenAIPolicy.d.ts.map +1 -0
  88. package/dist/OpenAIPolicy.js +62 -0
  89. package/dist/OpenAIPolicy.js.map +1 -0
  90. package/dist/PipePolicy.d.ts +26 -0
  91. package/dist/PipePolicy.d.ts.map +1 -0
  92. package/dist/PipePolicy.js +39 -0
  93. package/dist/PipePolicy.js.map +1 -0
  94. package/dist/PowPolicy.d.ts +21 -0
  95. package/dist/PowPolicy.d.ts.map +1 -0
  96. package/dist/PowPolicy.js +36 -0
  97. package/dist/PowPolicy.js.map +1 -0
  98. package/dist/PubkeyBanPolicy.d.ts +15 -0
  99. package/dist/PubkeyBanPolicy.d.ts.map +1 -0
  100. package/dist/PubkeyBanPolicy.js +28 -0
  101. package/dist/PubkeyBanPolicy.js.map +1 -0
  102. package/dist/ReadOnlyPolicy.d.ts +6 -0
  103. package/dist/ReadOnlyPolicy.d.ts.map +1 -0
  104. package/dist/ReadOnlyPolicy.js +12 -0
  105. package/dist/ReadOnlyPolicy.js.map +1 -0
  106. package/dist/RegexPolicy.d.ts +15 -0
  107. package/dist/RegexPolicy.d.ts.map +1 -0
  108. package/dist/RegexPolicy.js +26 -0
  109. package/dist/RegexPolicy.js.map +1 -0
  110. package/dist/ReplyBotPolicy.d.ts +25 -0
  111. package/dist/ReplyBotPolicy.d.ts.map +1 -0
  112. package/dist/ReplyBotPolicy.js +45 -0
  113. package/dist/ReplyBotPolicy.js.map +1 -0
  114. package/dist/SizePolicy.d.ts +23 -0
  115. package/dist/SizePolicy.d.ts.map +1 -0
  116. package/dist/SizePolicy.js +31 -0
  117. package/dist/SizePolicy.js.map +1 -0
  118. package/dist/WhitelistPolicy.d.ts +16 -0
  119. package/dist/WhitelistPolicy.d.ts.map +1 -0
  120. package/dist/WhitelistPolicy.js +35 -0
  121. package/dist/WhitelistPolicy.js.map +1 -0
  122. package/dist/WoTPolicy.d.ts +26 -0
  123. package/dist/WoTPolicy.d.ts.map +1 -0
  124. package/dist/WoTPolicy.js +42 -0
  125. package/dist/WoTPolicy.js.map +1 -0
  126. package/dist/mod.d.ts +21 -0
  127. package/dist/mod.d.ts.map +1 -0
  128. package/dist/mod.js +44 -0
  129. package/dist/mod.js.map +1 -0
  130. package/dist/tsconfig.tsbuildinfo +1 -0
  131. package/mod.ts +20 -0
  132. package/package.json +20 -0
  133. package/tsconfig.json +14 -0
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DomainPolicy = void 0;
4
+ const nostrify_1 = require("@nostrify/nostrify");
5
+ const AuthorPolicy_1 = require("./AuthorPolicy");
6
+ /** Ban events unless their author has a valid NIP-05 name. Domains can also be whitelisted or blacklisted. */
7
+ class DomainPolicy extends AuthorPolicy_1.AuthorPolicy {
8
+ constructor(store, opts = {}) {
9
+ super(store, {
10
+ async call(event, signal) {
11
+ const { blacklist = [], whitelist, lookup = DomainPolicy.lookup } = opts;
12
+ const metadata = nostrify_1.NSchema.json().pipe(nostrify_1.NSchema.metadata()).safeParse(event.content);
13
+ if (!metadata.success) {
14
+ return ['OK', event.id, false, 'blocked: invalid kind 0 metadata'];
15
+ }
16
+ const { nip05 } = metadata.data;
17
+ if (!nip05) {
18
+ return ['OK', event.id, false, 'blocked: missing nip05'];
19
+ }
20
+ const domain = nip05.split('@').pop();
21
+ if (!domain) {
22
+ return ['OK', event.id, false, 'blocked: invalid nip05'];
23
+ }
24
+ if (DomainPolicy.isDomainBlacklisted(domain, blacklist)) {
25
+ return ['OK', event.id, false, 'blocked: blacklisted nip05 domain'];
26
+ }
27
+ try {
28
+ const { pubkey } = await lookup(nip05, signal);
29
+ if (pubkey !== event.pubkey) {
30
+ return ['OK', event.id, false, 'blocked: mismatched nip05 pubkey'];
31
+ }
32
+ if (whitelist && !whitelist.includes(domain)) {
33
+ return [
34
+ 'OK',
35
+ event.id,
36
+ false,
37
+ 'blocked: nip05 domain not in whitelist',
38
+ ];
39
+ }
40
+ return ['OK', event.id, true, ''];
41
+ }
42
+ catch {
43
+ return ['OK', event.id, false, 'blocked: failed to lookup nip05'];
44
+ }
45
+ },
46
+ });
47
+ }
48
+ /** Check if a domain is blacklisted, including subdomains of blacklisted domains. */
49
+ static isDomainBlacklisted(domain, blacklist) {
50
+ // Check for exact match
51
+ if (blacklist.includes(domain)) {
52
+ return true;
53
+ }
54
+ // Check if domain is a subdomain of any blacklisted domain
55
+ for (const blacklistedDomain of blacklist) {
56
+ if (domain.endsWith('.' + blacklistedDomain)) {
57
+ return true;
58
+ }
59
+ }
60
+ return false;
61
+ }
62
+ /** Default NIP-05 lookup method if one isn't provided by the caller. */
63
+ static lookup(nip05, signal) {
64
+ return nostrify_1.NIP05.lookup(nip05, { signal });
65
+ }
66
+ }
67
+ exports.DomainPolicy = DomainPolicy;
68
+ //# sourceMappingURL=DomainPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DomainPolicy.js","sourceRoot":"","sources":["../DomainPolicy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { NostrEvent, NostrFilter, NostrRelayOK, NPolicy } from '@nostrify/types';
2
+ /**
3
+ * Reject events which don't match the filters.
4
+ *
5
+ * Only messages which **match** the filters are allowed, and all others are dropped.
6
+ * The filter is a [NIP-01](https://github.com/nostr-protocol/nips/blob/master/01.md) relay filter.
7
+ *
8
+ * ```ts
9
+ * // Only allow kind 1, 3, 5, and 7 events.
10
+ * new FiltersPolicy([{ kinds: [0, 1, 3, 5, 6, 7] }]);
11
+ * ```
12
+ */
13
+ export declare class FiltersPolicy implements NPolicy {
14
+ private filters;
15
+ constructor(filters: NostrFilter[]);
16
+ call(event: NostrEvent): Promise<NostrRelayOK>;
17
+ }
18
+ //# sourceMappingURL=FiltersPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FiltersPolicy.d.ts","sourceRoot":"","sources":["../FiltersPolicy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEjF;;;;;;;;;;GAUG;AACH,qBAAa,aAAc,YAAW,OAAO;IAC/B,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,WAAW,EAAE;IAGpC,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;CAOrD"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FiltersPolicy = void 0;
4
+ const nostr_tools_1 = require("nostr-tools");
5
+ /**
6
+ * Reject events which don't match the filters.
7
+ *
8
+ * Only messages which **match** the filters are allowed, and all others are dropped.
9
+ * The filter is a [NIP-01](https://github.com/nostr-protocol/nips/blob/master/01.md) relay filter.
10
+ *
11
+ * ```ts
12
+ * // Only allow kind 1, 3, 5, and 7 events.
13
+ * new FiltersPolicy([{ kinds: [0, 1, 3, 5, 6, 7] }]);
14
+ * ```
15
+ */
16
+ class FiltersPolicy {
17
+ filters;
18
+ constructor(filters) {
19
+ this.filters = filters;
20
+ }
21
+ // deno-lint-ignore require-await
22
+ async call(event) {
23
+ if ((0, nostr_tools_1.matchFilters)(this.filters, event)) {
24
+ return ['OK', event.id, true, ''];
25
+ }
26
+ return ['OK', event.id, false, "blocked: the event doesn't match the allowed filters"];
27
+ }
28
+ }
29
+ exports.FiltersPolicy = FiltersPolicy;
30
+ //# sourceMappingURL=FiltersPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FiltersPolicy.js","sourceRoot":"","sources":["../FiltersPolicy.ts"],"names":[],"mappings":";;;AAAA,6CAA2C;AAI3C;;;;;;;;;;GAUG;AACH,MAAa,aAAa;IACJ;IAApB,YAAoB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;IAAG,CAAC;IAE9C,iCAAiC;IACjC,KAAK,CAAC,IAAI,CAAC,KAAiB;QAC1B,IAAI,IAAA,0BAAY,EAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,sDAAsD,CAAC,CAAC;IACzF,CAAC;CACF;AAXD,sCAWC"}
@@ -0,0 +1,16 @@
1
+ import { NostrEvent, NostrRelayOK, NPolicy } from '@nostrify/types';
2
+ /**
3
+ * Reject events containing any of the banned hashtags.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * // Reject events with banned hashtags.
8
+ * HashtagPolicy(['nsfw']);
9
+ * ```
10
+ */
11
+ export declare class HashtagPolicy implements NPolicy {
12
+ private hashtags;
13
+ constructor(hashtags: string[]);
14
+ call({ id, tags }: NostrEvent): Promise<NostrRelayOK>;
15
+ }
16
+ //# sourceMappingURL=HashtagPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HashtagPolicy.d.ts","sourceRoot":"","sources":["../HashtagPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpE;;;;;;;;GAQG;AACH,qBAAa,aAAc,YAAW,OAAO;IAC/B,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM,EAAE;IAGhC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;CAS5D"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HashtagPolicy = void 0;
4
+ /**
5
+ * Reject events containing any of the banned hashtags.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // Reject events with banned hashtags.
10
+ * HashtagPolicy(['nsfw']);
11
+ * ```
12
+ */
13
+ class HashtagPolicy {
14
+ hashtags;
15
+ constructor(hashtags) {
16
+ this.hashtags = hashtags;
17
+ }
18
+ // deno-lint-ignore require-await
19
+ async call({ id, tags }) {
20
+ for (const [name, value] of tags) {
21
+ if (name === 't' && this.hashtags.includes(value.toLowerCase())) {
22
+ return ['OK', id, false, 'blocked: contains a banned hashtag'];
23
+ }
24
+ }
25
+ return ['OK', id, true, ''];
26
+ }
27
+ }
28
+ exports.HashtagPolicy = HashtagPolicy;
29
+ //# sourceMappingURL=HashtagPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HashtagPolicy.js","sourceRoot":"","sources":["../HashtagPolicy.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;GAQG;AACH,MAAa,aAAa;IACJ;IAApB,YAAoB,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAE1C,iCAAiC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAc;QACjC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YACjC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAChE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,oCAAoC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF;AAbD,sCAaC"}
@@ -0,0 +1,14 @@
1
+ import { NostrEvent, NostrRelayOK, NPolicy } from '@nostrify/types';
2
+ /** Policy options for `HellthreadPolicy`. */
3
+ interface HellthreadPolicyOpts {
4
+ /** Total number of "p" tags a kind 1 note may have before it's rejected. Default: `100` */
5
+ limit?: number;
6
+ }
7
+ /** Basic policy to demonstrate how policies work. Accepts all events. */
8
+ export declare class HellthreadPolicy implements NPolicy {
9
+ private opts;
10
+ constructor(opts?: HellthreadPolicyOpts);
11
+ call({ id, kind, tags }: NostrEvent): Promise<NostrRelayOK>;
12
+ }
13
+ export {};
14
+ //# sourceMappingURL=HellthreadPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HellthreadPolicy.d.ts","sourceRoot":"","sources":["../HellthreadPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpE,6CAA6C;AAC7C,UAAU,oBAAoB;IAC5B,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,yEAAyE;AACzE,qBAAa,gBAAiB,YAAW,OAAO;IAClC,OAAO,CAAC,IAAI;gBAAJ,IAAI,GAAE,oBAAyB;IAG7C,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;CAalE"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HellthreadPolicy = void 0;
4
+ /** Basic policy to demonstrate how policies work. Accepts all events. */
5
+ class HellthreadPolicy {
6
+ opts;
7
+ constructor(opts = {}) {
8
+ this.opts = opts;
9
+ }
10
+ // deno-lint-ignore require-await
11
+ async call({ id, kind, tags }) {
12
+ const { limit = 100 } = this.opts;
13
+ if (kind === 1) {
14
+ const p = tags.filter((tag) => tag[0] === 'p');
15
+ if (p.length > limit) {
16
+ return ['OK', id, false, `blocked: rejected due to ${p.length} "p" tags (${limit} is the limit).`];
17
+ }
18
+ }
19
+ return ['OK', id, true, ''];
20
+ }
21
+ }
22
+ exports.HellthreadPolicy = HellthreadPolicy;
23
+ //# sourceMappingURL=HellthreadPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HellthreadPolicy.js","sourceRoot":"","sources":["../HellthreadPolicy.ts"],"names":[],"mappings":";;;AAQA,yEAAyE;AACzE,MAAa,gBAAgB;IACP;IAApB,YAAoB,OAA6B,EAAE;QAA/B,SAAI,GAAJ,IAAI,CAA2B;IAAG,CAAC;IAEvD,iCAAiC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAc;QACvC,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAElC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YAE/C,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,4BAA4B,CAAC,CAAC,MAAM,cAAc,KAAK,iBAAiB,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF;AAjBD,4CAiBC"}
@@ -0,0 +1,9 @@
1
+ import { NostrEvent, NostrRelayOK, NPolicy } from '@nostrify/types';
2
+ /** Rejects if the policy passes, passes if the policy rejects. */
3
+ export declare class InvertPolicy implements NPolicy {
4
+ private policy;
5
+ private reason;
6
+ constructor(policy: NPolicy, reason: string);
7
+ call(event: NostrEvent): Promise<NostrRelayOK>;
8
+ }
9
+ //# sourceMappingURL=InvertPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvertPolicy.d.ts","sourceRoot":"","sources":["../InvertPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpE,kEAAkE;AAClE,qBAAa,YAAa,YAAW,OAAO;IAC9B,OAAO,CAAC,MAAM;IAAW,OAAO,CAAC,MAAM;gBAA/B,MAAM,EAAE,OAAO,EAAU,MAAM,EAAE,MAAM;IAErD,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;CAUrD"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InvertPolicy = void 0;
4
+ /** Rejects if the policy passes, passes if the policy rejects. */
5
+ class InvertPolicy {
6
+ policy;
7
+ reason;
8
+ constructor(policy, reason) {
9
+ this.policy = policy;
10
+ this.reason = reason;
11
+ }
12
+ async call(event) {
13
+ const result = await this.policy.call(event);
14
+ const ok = result[2];
15
+ if (ok) {
16
+ return ['OK', event.id, false, this.reason];
17
+ }
18
+ else {
19
+ return ['OK', event.id, true, ''];
20
+ }
21
+ }
22
+ }
23
+ exports.InvertPolicy = InvertPolicy;
24
+ //# sourceMappingURL=InvertPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvertPolicy.js","sourceRoot":"","sources":["../InvertPolicy.ts"],"names":[],"mappings":";;;AAEA,kEAAkE;AAClE,MAAa,YAAY;IACH;IAAyB;IAA7C,YAAoB,MAAe,EAAU,MAAc;QAAvC,WAAM,GAAN,MAAM,CAAS;QAAU,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/D,KAAK,CAAC,IAAI,CAAC,KAAiB;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAErB,IAAI,EAAE,EAAE,CAAC;YACP,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF;AAbD,oCAaC"}
@@ -0,0 +1,16 @@
1
+ import { NostrEvent, NostrRelayOK, NPolicy } from '@nostrify/types';
2
+ /**
3
+ * Reject events containing any of the strings in its content.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * // Reject events with bad words.
8
+ * KeywordPolicy(['moo', 'oink', 'honk']);
9
+ * ```
10
+ */
11
+ export declare class KeywordPolicy implements NPolicy {
12
+ private words;
13
+ constructor(words: Iterable<string>);
14
+ call({ id, content }: NostrEvent): Promise<NostrRelayOK>;
15
+ }
16
+ //# sourceMappingURL=KeywordPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeywordPolicy.d.ts","sourceRoot":"","sources":["../KeywordPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpE;;;;;;;;GAQG;AACH,qBAAa,aAAc,YAAW,OAAO;IAC/B,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;IAGrC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;CAS/D"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KeywordPolicy = void 0;
4
+ /**
5
+ * Reject events containing any of the strings in its content.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // Reject events with bad words.
10
+ * KeywordPolicy(['moo', 'oink', 'honk']);
11
+ * ```
12
+ */
13
+ class KeywordPolicy {
14
+ words;
15
+ constructor(words) {
16
+ this.words = words;
17
+ }
18
+ // deno-lint-ignore require-await
19
+ async call({ id, content }) {
20
+ for (const word of this.words) {
21
+ if (content.toLowerCase().includes(word.toLowerCase())) {
22
+ return ['OK', id, false, 'blocked: contains a banned word or phrase'];
23
+ }
24
+ }
25
+ return ['OK', id, true, ''];
26
+ }
27
+ }
28
+ exports.KeywordPolicy = KeywordPolicy;
29
+ //# sourceMappingURL=KeywordPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeywordPolicy.js","sourceRoot":"","sources":["../KeywordPolicy.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;GAQG;AACH,MAAa,aAAa;IACJ;IAApB,YAAoB,KAAuB;QAAvB,UAAK,GAAL,KAAK,CAAkB;IAAG,CAAC;IAE/C,iCAAiC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAc;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,2CAA2C,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF;AAbD,sCAaC"}
@@ -0,0 +1,6 @@
1
+ import { NostrEvent, NostrRelayOK, NPolicy } from '@nostrify/types';
2
+ /** Basic policy to demonstrate how policies work. Accepts all events. */
3
+ export declare class NoOpPolicy implements NPolicy {
4
+ call(event: NostrEvent): Promise<NostrRelayOK>;
5
+ }
6
+ //# sourceMappingURL=NoOpPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoOpPolicy.d.ts","sourceRoot":"","sources":["../NoOpPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpE,yEAAyE;AACzE,qBAAa,UAAW,YAAW,OAAO;IAElC,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;CAGrD"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NoOpPolicy = void 0;
4
+ /** Basic policy to demonstrate how policies work. Accepts all events. */
5
+ class NoOpPolicy {
6
+ // deno-lint-ignore require-await
7
+ async call(event) {
8
+ return ['OK', event.id, true, ''];
9
+ }
10
+ }
11
+ exports.NoOpPolicy = NoOpPolicy;
12
+ //# sourceMappingURL=NoOpPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoOpPolicy.js","sourceRoot":"","sources":["../NoOpPolicy.ts"],"names":[],"mappings":";;;AAEA,yEAAyE;AACzE,MAAa,UAAU;IACrB,iCAAiC;IACjC,KAAK,CAAC,IAAI,CAAC,KAAiB;QAC1B,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;CACF;AALD,gCAKC"}
@@ -0,0 +1,80 @@
1
+ import { NostrEvent, NostrRelayOK, NPolicy } from '@nostrify/types';
2
+ /**
3
+ * OpenAI moderation result.
4
+ *
5
+ * https://platform.openai.com/docs/api-reference/moderations/create
6
+ */
7
+ interface OpenAIModerationResult {
8
+ id: string;
9
+ model: string;
10
+ results: {
11
+ categories: {
12
+ 'hate': boolean;
13
+ 'hate/threatening': boolean;
14
+ 'self-harm': boolean;
15
+ 'sexual': boolean;
16
+ 'sexual/minors': boolean;
17
+ 'violence': boolean;
18
+ 'violence/graphic': boolean;
19
+ };
20
+ category_scores: {
21
+ 'hate': number;
22
+ 'hate/threatening': number;
23
+ 'self-harm': number;
24
+ 'sexual': number;
25
+ 'sexual/minors': number;
26
+ 'violence': number;
27
+ 'violence/graphic': number;
28
+ };
29
+ flagged: boolean;
30
+ }[];
31
+ }
32
+ /** Policy options for `OpenAIPolicy`. */
33
+ interface OpenAIPolicyOpts {
34
+ /**
35
+ * Callback for fine control over the policy. It contains the event and the OpenAI moderation data.
36
+ * Implementations should return `true` to **reject** the content, and `false` to accept.
37
+ */
38
+ handler?(event: NostrEvent, result: OpenAIModerationResult): boolean;
39
+ /** Custom endpoint to use instead of `https://api.openai.com/v1/moderations`. */
40
+ endpoint?: string;
41
+ /** Custom fetch implementation. */
42
+ fetch?: typeof fetch;
43
+ /** Which event kinds to apply the policy to. */
44
+ kinds?: number[];
45
+ /** OpenAI API key for making the requests. */
46
+ apiKey: string;
47
+ }
48
+ /**
49
+ * Passes event content to OpenAI and then rejects flagged events.
50
+ *
51
+ * By default, this policy will reject kind 1 events that OpenAI flags.
52
+ * It's possible to pass a custom handler for more control. An OpenAI API key is required.
53
+ *
54
+ * ```ts
55
+ * // Default handler. It's so strict it's suitable for children.
56
+ * new OpenAIPolicy({ apiKey: Deno.env.get('OPENAI_API_KEY') });
57
+ *
58
+ * // With a custom handler.
59
+ * new OpenAIPolicy({
60
+ * apiKey: Deno.env.get('OPENAI_API_KEY'),
61
+ * handler(event, data) {
62
+ * // Loop each result.
63
+ * return data.results.some((result) => {
64
+ * if (result.flagged) {
65
+ * const { sexual, violence } = result.categories;
66
+ * // Reject only events flagged as sexual and violent.
67
+ * return sexual && violence;
68
+ * }
69
+ * });
70
+ * },
71
+ * });
72
+ * ```
73
+ */
74
+ export declare class OpenAIPolicy implements NPolicy {
75
+ private opts;
76
+ constructor(opts: OpenAIPolicyOpts);
77
+ call(event: NostrEvent, signal?: AbortSignal): Promise<NostrRelayOK>;
78
+ }
79
+ export {};
80
+ //# sourceMappingURL=OpenAIPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAIPolicy.d.ts","sourceRoot":"","sources":["../OpenAIPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpE;;;;GAIG;AACH,UAAU,sBAAsB;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,UAAU,EAAE;YACV,MAAM,EAAE,OAAO,CAAC;YAChB,kBAAkB,EAAE,OAAO,CAAC;YAC5B,WAAW,EAAE,OAAO,CAAC;YACrB,QAAQ,EAAE,OAAO,CAAC;YAClB,eAAe,EAAE,OAAO,CAAC;YACzB,UAAU,EAAE,OAAO,CAAC;YACpB,kBAAkB,EAAE,OAAO,CAAC;SAC7B,CAAC;QACF,eAAe,EAAE;YACf,MAAM,EAAE,MAAM,CAAC;YACf,kBAAkB,EAAE,MAAM,CAAC;YAC3B,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,MAAM,CAAC;YACjB,eAAe,EAAE,MAAM,CAAC;YACxB,UAAU,EAAE,MAAM,CAAC;YACnB,kBAAkB,EAAE,MAAM,CAAC;SAC5B,CAAC;QACF,OAAO,EAAE,OAAO,CAAC;KAClB,EAAE,CAAC;CACL;AAED,yCAAyC;AACzC,UAAU,gBAAgB;IACxB;;;OAGG;IACH,OAAO,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC;IACrE,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,YAAa,YAAW,OAAO;IAC9B,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,gBAAgB;IAEpC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAiC3E"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenAIPolicy = void 0;
4
+ /**
5
+ * Passes event content to OpenAI and then rejects flagged events.
6
+ *
7
+ * By default, this policy will reject kind 1 events that OpenAI flags.
8
+ * It's possible to pass a custom handler for more control. An OpenAI API key is required.
9
+ *
10
+ * ```ts
11
+ * // Default handler. It's so strict it's suitable for children.
12
+ * new OpenAIPolicy({ apiKey: Deno.env.get('OPENAI_API_KEY') });
13
+ *
14
+ * // With a custom handler.
15
+ * new OpenAIPolicy({
16
+ * apiKey: Deno.env.get('OPENAI_API_KEY'),
17
+ * handler(event, data) {
18
+ * // Loop each result.
19
+ * return data.results.some((result) => {
20
+ * if (result.flagged) {
21
+ * const { sexual, violence } = result.categories;
22
+ * // Reject only events flagged as sexual and violent.
23
+ * return sexual && violence;
24
+ * }
25
+ * });
26
+ * },
27
+ * });
28
+ * ```
29
+ */
30
+ class OpenAIPolicy {
31
+ opts;
32
+ constructor(opts) {
33
+ this.opts = opts;
34
+ }
35
+ async call(event, signal) {
36
+ const { handler = (_, { results }) => results.some((r) => r.flagged), endpoint = 'https://api.openai.com/v1/moderations', kinds = [1, 30023], apiKey, } = this.opts;
37
+ if (kinds.includes(event.kind)) {
38
+ try {
39
+ const resp = await fetch(endpoint, {
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ 'Authorization': `Bearer ${apiKey}`,
43
+ },
44
+ body: JSON.stringify({
45
+ input: event.content,
46
+ }),
47
+ signal,
48
+ });
49
+ const result = await resp.json();
50
+ if (handler(event, result)) {
51
+ return ['OK', event.id, false, 'blocked: content flagged by AI'];
52
+ }
53
+ }
54
+ catch (_) {
55
+ return ['OK', event.id, false, 'blocked: error analyzing content'];
56
+ }
57
+ }
58
+ return ['OK', event.id, true, ''];
59
+ }
60
+ }
61
+ exports.OpenAIPolicy = OpenAIPolicy;
62
+ //# sourceMappingURL=OpenAIPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAIPolicy.js","sourceRoot":"","sources":["../OpenAIPolicy.ts"],"names":[],"mappings":";;;AAkDA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAa,YAAY;IACH;IAApB,YAAoB,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAE9C,KAAK,CAAC,IAAI,CAAC,KAAiB,EAAE,MAAoB;QAChD,MAAM,EACJ,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAC5D,QAAQ,GAAG,uCAAuC,EAClD,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAClB,MAAM,GACP,GAAG,IAAI,CAAC,IAAI,CAAC;QAEd,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;oBACjC,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,eAAe,EAAE,UAAU,MAAM,EAAE;qBACpC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK,EAAE,KAAK,CAAC,OAAO;qBACrB,CAAC;oBACF,MAAM;iBACP,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAEjC,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,gCAAgC,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,kCAAkC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;CACF;AApCD,oCAoCC"}
@@ -0,0 +1,26 @@
1
+ import { NostrEvent, NostrRelayOK, NPolicy } from '@nostrify/types';
2
+ /**
3
+ * Processes events through multiple policies.
4
+ *
5
+ * If any policy rejects, the pipeline will stop and return the rejected message.
6
+ *
7
+ * ```ts
8
+ * const policy = new PipePolicy([
9
+ * new NoOpPolicy(),
10
+ * new FiltersPolicy([{ kinds: [0, 1, 3, 5, 7, 1984, 9734, 9735, 10002] }]),
11
+ * new KeywordPolicy(['https://t.me/']),
12
+ * new RegexPolicy(/(🟠|🔥|😳)ChtaGPT/i),
13
+ * new PubkeyBanPolicy(['e810fafa1e89cdf80cced8e013938e87e21b699b24c8570537be92aec4b12c18']),
14
+ * new HellthreadPolicy({ limit: 100 }),
15
+ * new AntiDuplicationPolicy({ kv: await Deno.openKv(), expireIn: 60000, minLength: 50 }),
16
+ * ]);
17
+ *
18
+ * const [_, eventId, ok, reason] = await policy.call(event);
19
+ * ```
20
+ */
21
+ export declare class PipePolicy implements NPolicy {
22
+ private policies;
23
+ constructor(policies: NPolicy[]);
24
+ call(event: NostrEvent, signal?: AbortSignal): Promise<NostrRelayOK>;
25
+ }
26
+ //# sourceMappingURL=PipePolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipePolicy.d.ts","sourceRoot":"","sources":["../PipePolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpE;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAW,YAAW,OAAO;IAC5B,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,OAAO,EAAE;IAEjC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAW3E"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PipePolicy = void 0;
4
+ /**
5
+ * Processes events through multiple policies.
6
+ *
7
+ * If any policy rejects, the pipeline will stop and return the rejected message.
8
+ *
9
+ * ```ts
10
+ * const policy = new PipePolicy([
11
+ * new NoOpPolicy(),
12
+ * new FiltersPolicy([{ kinds: [0, 1, 3, 5, 7, 1984, 9734, 9735, 10002] }]),
13
+ * new KeywordPolicy(['https://t.me/']),
14
+ * new RegexPolicy(/(🟠|🔥|😳)ChtaGPT/i),
15
+ * new PubkeyBanPolicy(['e810fafa1e89cdf80cced8e013938e87e21b699b24c8570537be92aec4b12c18']),
16
+ * new HellthreadPolicy({ limit: 100 }),
17
+ * new AntiDuplicationPolicy({ kv: await Deno.openKv(), expireIn: 60000, minLength: 50 }),
18
+ * ]);
19
+ *
20
+ * const [_, eventId, ok, reason] = await policy.call(event);
21
+ * ```
22
+ */
23
+ class PipePolicy {
24
+ policies;
25
+ constructor(policies) {
26
+ this.policies = policies;
27
+ }
28
+ async call(event, signal) {
29
+ for (const policy of this.policies) {
30
+ const [_, eventId, ok, reason] = await policy.call(event, signal);
31
+ if (!ok) {
32
+ return [_, eventId, ok, reason];
33
+ }
34
+ }
35
+ return ['OK', event.id, true, ''];
36
+ }
37
+ }
38
+ exports.PipePolicy = PipePolicy;
39
+ //# sourceMappingURL=PipePolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipePolicy.js","sourceRoot":"","sources":["../PipePolicy.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAa,UAAU;IACD;IAApB,YAAoB,QAAmB;QAAnB,aAAQ,GAAR,QAAQ,CAAW;IAAG,CAAC;IAE3C,KAAK,CAAC,IAAI,CAAC,KAAiB,EAAE,MAAoB;QAChD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAElE,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;CACF;AAdD,gCAcC"}
@@ -0,0 +1,21 @@
1
+ import { NostrEvent, NostrRelayInfo, NostrRelayOK, NPolicy } from '@nostrify/types';
2
+ /** Policy options for `PowPolicy`. */
3
+ interface PowPolicyOpts {
4
+ /** Events will be rejected if their `id` does not contain at least this many leading 0 bits. Default: `1` */
5
+ difficulty?: number;
6
+ }
7
+ /**
8
+ * Reject events which don't meet Proof-of-Work ([NIP-13](https://github.com/nostr-protocol/nips/blob/master/13.md)) criteria.
9
+ *
10
+ * ```ts
11
+ * new PowPolicy({ difficulty: 20 });
12
+ * ```
13
+ */
14
+ export declare class PowPolicy implements NPolicy {
15
+ private opts;
16
+ constructor(opts?: PowPolicyOpts);
17
+ call({ id, tags }: NostrEvent): Promise<NostrRelayOK>;
18
+ get info(): NostrRelayInfo;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=PowPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PowPolicy.d.ts","sourceRoot":"","sources":["../PowPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGpF,sCAAsC;AACtC,UAAU,aAAa;IACrB,6GAA6G;IAC7G,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,SAAU,YAAW,OAAO;IAC3B,OAAO,CAAC,IAAI;gBAAJ,IAAI,GAAE,aAAkB;IAGtC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAa3D,IAAI,IAAI,IAAI,cAAc,CAMzB;CACF"}