@kodelyth/nostr 2026.5.39 → 2026.5.42

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 (69) hide show
  1. package/README.md +142 -0
  2. package/api.ts +10 -0
  3. package/channel-plugin-api.ts +1 -0
  4. package/dist/api.js +522 -0
  5. package/dist/channel-CnPQxTzj.js +1467 -0
  6. package/dist/channel-plugin-api.js +2 -0
  7. package/dist/config-schema-KoL8Et_9.js +63 -0
  8. package/dist/default-relays-DLwdWOTu.js +4 -0
  9. package/dist/inbound-direct-dm-runtime-CeYGU_Fo.js +2 -0
  10. package/dist/index.js +81 -0
  11. package/dist/runtime-api.js +2 -0
  12. package/dist/setup-api.js +2 -0
  13. package/dist/setup-entry.js +11 -0
  14. package/dist/setup-plugin-api.js +166 -0
  15. package/dist/setup-surface-DFlfVW6j.js +337 -0
  16. package/dist/test-api.js +2 -0
  17. package/index.ts +95 -0
  18. package/klaw.plugin.json +2 -185
  19. package/package.json +4 -4
  20. package/runtime-api.ts +6 -0
  21. package/setup-api.ts +1 -0
  22. package/setup-entry.ts +9 -0
  23. package/setup-plugin-api.ts +3 -0
  24. package/src/channel-api.ts +11 -0
  25. package/src/channel.inbound.test.ts +187 -0
  26. package/src/channel.outbound.test.ts +163 -0
  27. package/src/channel.setup.ts +234 -0
  28. package/src/channel.test.ts +526 -0
  29. package/src/channel.ts +215 -0
  30. package/src/config-schema.ts +98 -0
  31. package/src/default-relays.ts +1 -0
  32. package/src/gateway.ts +321 -0
  33. package/src/inbound-direct-dm-runtime.ts +1 -0
  34. package/src/metrics.ts +458 -0
  35. package/src/nostr-bus.fuzz.test.ts +382 -0
  36. package/src/nostr-bus.inbound.test.ts +526 -0
  37. package/src/nostr-bus.integration.test.ts +477 -0
  38. package/src/nostr-bus.test.ts +231 -0
  39. package/src/nostr-bus.ts +789 -0
  40. package/src/nostr-key-utils.ts +94 -0
  41. package/src/nostr-profile-core.ts +134 -0
  42. package/src/nostr-profile-http-runtime.ts +6 -0
  43. package/src/nostr-profile-http.test.ts +632 -0
  44. package/src/nostr-profile-http.ts +583 -0
  45. package/src/nostr-profile-import.test.ts +119 -0
  46. package/src/nostr-profile-import.ts +262 -0
  47. package/src/nostr-profile-url-safety.ts +21 -0
  48. package/src/nostr-profile.fuzz.test.ts +430 -0
  49. package/src/nostr-profile.test.ts +415 -0
  50. package/src/nostr-profile.ts +144 -0
  51. package/src/nostr-state-store.test.ts +237 -0
  52. package/src/nostr-state-store.ts +206 -0
  53. package/src/runtime.ts +9 -0
  54. package/src/seen-tracker.ts +289 -0
  55. package/src/session-route.ts +25 -0
  56. package/src/setup-surface.ts +264 -0
  57. package/src/test-fixtures.ts +45 -0
  58. package/src/types.ts +117 -0
  59. package/test/setup.ts +5 -0
  60. package/test-api.ts +1 -0
  61. package/tsconfig.json +16 -0
  62. package/api.js +0 -7
  63. package/channel-plugin-api.js +0 -7
  64. package/index.js +0 -7
  65. package/runtime-api.js +0 -7
  66. package/setup-api.js +0 -7
  67. package/setup-entry.js +0 -7
  68. package/setup-plugin-api.js +0 -7
  69. package/test-api.js +0 -7
package/src/types.ts ADDED
@@ -0,0 +1,117 @@
1
+ import {
2
+ DEFAULT_ACCOUNT_ID,
3
+ normalizeAccountId,
4
+ normalizeOptionalAccountId,
5
+ } from "klaw/plugin-sdk/account-id";
6
+ import {
7
+ listCombinedAccountIds,
8
+ resolveListedDefaultAccountId,
9
+ } from "klaw/plugin-sdk/account-resolution";
10
+ import type { KlawConfig } from "klaw/plugin-sdk/config-contracts";
11
+ import { normalizeSecretInputString, type SecretInput } from "klaw/plugin-sdk/secret-input";
12
+ import { normalizeOptionalString } from "klaw/plugin-sdk/string-coerce-runtime";
13
+ import type { NostrProfile } from "./config-schema.js";
14
+ import { DEFAULT_RELAYS } from "./default-relays.js";
15
+ import { getPublicKeyFromPrivate } from "./nostr-key-utils.js";
16
+
17
+ interface NostrAccountConfig {
18
+ enabled?: boolean;
19
+ name?: string;
20
+ defaultAccount?: string;
21
+ privateKey?: SecretInput;
22
+ relays?: string[];
23
+ dmPolicy?: "pairing" | "allowlist" | "open" | "disabled";
24
+ allowFrom?: Array<string | number>;
25
+ profile?: NostrProfile;
26
+ }
27
+
28
+ export interface ResolvedNostrAccount {
29
+ accountId: string;
30
+ name?: string;
31
+ enabled: boolean;
32
+ configured: boolean;
33
+ privateKey: string;
34
+ publicKey: string;
35
+ relays: string[];
36
+ profile?: NostrProfile;
37
+ config: NostrAccountConfig;
38
+ }
39
+
40
+ function resolveConfiguredDefaultNostrAccountId(cfg: KlawConfig): string | undefined {
41
+ const nostrCfg = (cfg.channels as Record<string, unknown> | undefined)?.nostr as
42
+ | NostrAccountConfig
43
+ | undefined;
44
+ return normalizeOptionalAccountId(nostrCfg?.defaultAccount);
45
+ }
46
+
47
+ /**
48
+ * List all configured Nostr account IDs
49
+ */
50
+ export function listNostrAccountIds(cfg: KlawConfig): string[] {
51
+ const nostrCfg = (cfg.channels as Record<string, unknown> | undefined)?.nostr as
52
+ | NostrAccountConfig
53
+ | undefined;
54
+ const privateKey = normalizeSecretInputString(nostrCfg?.privateKey);
55
+ return listCombinedAccountIds({
56
+ configuredAccountIds: [],
57
+ implicitAccountId: privateKey
58
+ ? (resolveConfiguredDefaultNostrAccountId(cfg) ?? DEFAULT_ACCOUNT_ID)
59
+ : undefined,
60
+ });
61
+ }
62
+
63
+ /**
64
+ * Get the default account ID
65
+ */
66
+ export function resolveDefaultNostrAccountId(cfg: KlawConfig): string {
67
+ return resolveListedDefaultAccountId({
68
+ accountIds: listNostrAccountIds(cfg),
69
+ configuredDefaultAccountId: resolveConfiguredDefaultNostrAccountId(cfg),
70
+ });
71
+ }
72
+
73
+ /**
74
+ * Resolve a Nostr account from config
75
+ */
76
+ export function resolveNostrAccount(opts: {
77
+ cfg: KlawConfig;
78
+ accountId?: string | null;
79
+ }): ResolvedNostrAccount {
80
+ const accountId = normalizeAccountId(opts.accountId ?? resolveDefaultNostrAccountId(opts.cfg));
81
+ const nostrCfg = (opts.cfg.channels as Record<string, unknown> | undefined)?.nostr as
82
+ | NostrAccountConfig
83
+ | undefined;
84
+
85
+ const baseEnabled = nostrCfg?.enabled !== false;
86
+ const privateKey = normalizeSecretInputString(nostrCfg?.privateKey) ?? "";
87
+ const configured = Boolean(privateKey);
88
+
89
+ let publicKey = "";
90
+ if (privateKey) {
91
+ try {
92
+ publicKey = getPublicKeyFromPrivate(privateKey);
93
+ } catch {
94
+ // Invalid key - leave publicKey empty, configured will indicate issues
95
+ }
96
+ }
97
+
98
+ return {
99
+ accountId,
100
+ name: normalizeOptionalString(nostrCfg?.name),
101
+ enabled: baseEnabled,
102
+ configured,
103
+ privateKey,
104
+ publicKey,
105
+ relays: nostrCfg?.relays ?? DEFAULT_RELAYS,
106
+ profile: nostrCfg?.profile,
107
+ config: {
108
+ enabled: nostrCfg?.enabled,
109
+ name: nostrCfg?.name,
110
+ privateKey: nostrCfg?.privateKey,
111
+ relays: nostrCfg?.relays,
112
+ dmPolicy: nostrCfg?.dmPolicy,
113
+ allowFrom: nostrCfg?.allowFrom,
114
+ profile: nostrCfg?.profile,
115
+ },
116
+ };
117
+ }
package/test/setup.ts ADDED
@@ -0,0 +1,5 @@
1
+ // Test setup file for nostr extension
2
+ import { vi } from "vitest";
3
+
4
+ // Mock console.error to suppress noise in tests
5
+ vi.spyOn(console, "error").mockImplementation(() => {});
package/test-api.ts ADDED
@@ -0,0 +1 @@
1
+ export { nostrPlugin } from "./src/channel.js";
package/tsconfig.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "extends": "../tsconfig.package-boundary.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "."
5
+ },
6
+ "include": ["./*.ts", "./src/**/*.ts"],
7
+ "exclude": [
8
+ "./**/*.test.ts",
9
+ "./dist/**",
10
+ "./node_modules/**",
11
+ "./src/test-support/**",
12
+ "./src/**/*test-helpers.ts",
13
+ "./src/**/*test-harness.ts",
14
+ "./src/**/*test-support.ts"
15
+ ]
16
+ }
package/api.js DELETED
@@ -1,7 +0,0 @@
1
- export * from "../../../dist/extensions/nostr/api.js";
2
- import * as module from "../../../dist/extensions/nostr/api.js";
3
- let defaultExport = "default" in module ? module.default : module;
4
- for (let index = 0; index < 4 && defaultExport && typeof defaultExport === "object" && "default" in defaultExport; index += 1) {
5
- defaultExport = defaultExport.default;
6
- }
7
- export { defaultExport as default };
@@ -1,7 +0,0 @@
1
- export * from "../../../dist/extensions/nostr/channel-plugin-api.js";
2
- import * as module from "../../../dist/extensions/nostr/channel-plugin-api.js";
3
- let defaultExport = "default" in module ? module.default : module;
4
- for (let index = 0; index < 4 && defaultExport && typeof defaultExport === "object" && "default" in defaultExport; index += 1) {
5
- defaultExport = defaultExport.default;
6
- }
7
- export { defaultExport as default };
package/index.js DELETED
@@ -1,7 +0,0 @@
1
- export * from "../../../dist/extensions/nostr/index.js";
2
- import defaultModule from "../../../dist/extensions/nostr/index.js";
3
- let defaultExport = defaultModule;
4
- for (let index = 0; index < 4 && defaultExport && typeof defaultExport === "object" && "default" in defaultExport; index += 1) {
5
- defaultExport = defaultExport.default;
6
- }
7
- export { defaultExport as default };
package/runtime-api.js DELETED
@@ -1,7 +0,0 @@
1
- export * from "../../../dist/extensions/nostr/runtime-api.js";
2
- import * as module from "../../../dist/extensions/nostr/runtime-api.js";
3
- let defaultExport = "default" in module ? module.default : module;
4
- for (let index = 0; index < 4 && defaultExport && typeof defaultExport === "object" && "default" in defaultExport; index += 1) {
5
- defaultExport = defaultExport.default;
6
- }
7
- export { defaultExport as default };
package/setup-api.js DELETED
@@ -1,7 +0,0 @@
1
- export * from "../../../dist/extensions/nostr/setup-api.js";
2
- import * as module from "../../../dist/extensions/nostr/setup-api.js";
3
- let defaultExport = "default" in module ? module.default : module;
4
- for (let index = 0; index < 4 && defaultExport && typeof defaultExport === "object" && "default" in defaultExport; index += 1) {
5
- defaultExport = defaultExport.default;
6
- }
7
- export { defaultExport as default };
package/setup-entry.js DELETED
@@ -1,7 +0,0 @@
1
- export * from "../../../dist/extensions/nostr/setup-entry.js";
2
- import defaultModule from "../../../dist/extensions/nostr/setup-entry.js";
3
- let defaultExport = defaultModule;
4
- for (let index = 0; index < 4 && defaultExport && typeof defaultExport === "object" && "default" in defaultExport; index += 1) {
5
- defaultExport = defaultExport.default;
6
- }
7
- export { defaultExport as default };
@@ -1,7 +0,0 @@
1
- export * from "../../../dist/extensions/nostr/setup-plugin-api.js";
2
- import * as module from "../../../dist/extensions/nostr/setup-plugin-api.js";
3
- let defaultExport = "default" in module ? module.default : module;
4
- for (let index = 0; index < 4 && defaultExport && typeof defaultExport === "object" && "default" in defaultExport; index += 1) {
5
- defaultExport = defaultExport.default;
6
- }
7
- export { defaultExport as default };
package/test-api.js DELETED
@@ -1,7 +0,0 @@
1
- export * from "../../../dist/extensions/nostr/test-api.js";
2
- import * as module from "../../../dist/extensions/nostr/test-api.js";
3
- let defaultExport = "default" in module ? module.default : module;
4
- for (let index = 0; index < 4 && defaultExport && typeof defaultExport === "object" && "default" in defaultExport; index += 1) {
5
- defaultExport = defaultExport.default;
6
- }
7
- export { defaultExport as default };