@nostrify/nostrify 0.46.7 → 0.46.8
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.
- package/.turbo/turbo-build.log +28 -5
- package/.turbo/turbo-setup.log +13 -0
- package/.turbo/turbo-test.log +123 -0
- package/BunkerURI.test.ts +19 -14
- package/CHANGELOG.md +8 -0
- package/NBrowserSigner.test.ts +49 -34
- package/NCache.test.ts +14 -7
- package/NCache.ts +2 -2
- package/NConnectSigner.test.ts +48 -31
- package/NConnectSigner.ts +3 -3
- package/NIP05.test.ts +36 -44
- package/NIP05.ts +2 -2
- package/NIP50.test.ts +35 -34
- package/NIP98.test.ts +89 -76
- package/NIP98.ts +2 -2
- package/NKinds.test.ts +37 -36
- package/NPool.test.ts +35 -24
- package/NPool.ts +42 -23
- package/NRelay1.test.ts +100 -68
- package/NRelay1.ts +13 -6
- package/NSchema.test.ts +98 -56
- package/NSchema.ts +10 -14
- package/NSecSigner.test.ts +19 -10
- package/NSecSigner.ts +4 -3
- package/NSet.test.ts +123 -50
- package/NSet.ts +13 -6
- package/RelayError.test.ts +11 -10
- package/RelayError.ts +1 -1
- package/dist/BunkerURI.js +44 -44
- package/dist/NBrowserSigner.js +73 -83
- package/dist/NCache.d.ts +2 -2
- package/dist/NCache.d.ts.map +1 -1
- package/dist/NCache.js +35 -56
- package/dist/NConnectSigner.d.ts +1 -1
- package/dist/NConnectSigner.d.ts.map +1 -1
- package/dist/NConnectSigner.js +124 -117
- package/dist/NIP05.d.ts +1 -1
- package/dist/NIP05.d.ts.map +1 -1
- package/dist/NIP05.js +33 -33
- package/dist/NIP50.js +19 -20
- package/dist/NIP98.d.ts +1 -1
- package/dist/NIP98.d.ts.map +1 -1
- package/dist/NIP98.js +71 -64
- package/dist/NKinds.js +24 -22
- package/dist/NPool.d.ts +2 -2
- package/dist/NPool.d.ts.map +1 -1
- package/dist/NPool.js +143 -170
- package/dist/NRelay1.d.ts +5 -4
- package/dist/NRelay1.d.ts.map +1 -1
- package/dist/NRelay1.js +301 -315
- package/dist/NSchema.d.ts +1 -1
- package/dist/NSchema.d.ts.map +1 -1
- package/dist/NSchema.js +185 -208
- package/dist/NSecSigner.d.ts +1 -2
- package/dist/NSecSigner.d.ts.map +1 -1
- package/dist/NSecSigner.js +35 -46
- package/dist/NSet.d.ts +1 -1
- package/dist/NSet.d.ts.map +1 -1
- package/dist/NSet.js +138 -166
- package/dist/RelayError.d.ts +1 -1
- package/dist/RelayError.d.ts.map +1 -1
- package/dist/RelayError.js +18 -17
- package/dist/ln/LNURL.d.ts +4 -4
- package/dist/ln/LNURL.d.ts.map +1 -1
- package/dist/ln/LNURL.js +93 -93
- package/dist/ln/mod.d.ts +3 -3
- package/dist/ln/mod.js +4 -2
- package/dist/ln/mod.js.map +7 -1
- package/dist/ln/types/LNURLCallback.js +0 -2
- package/dist/ln/types/LNURLDetails.js +0 -2
- package/dist/mod.d.ts +14 -14
- package/dist/mod.js +30 -15
- package/dist/mod.js.map +7 -1
- package/dist/test/ErrorRelay.d.ts +1 -1
- package/dist/test/ErrorRelay.d.ts.map +1 -1
- package/dist/test/ErrorRelay.js +22 -21
- package/dist/test/MockRelay.d.ts +3 -3
- package/dist/test/MockRelay.d.ts.map +1 -1
- package/dist/test/MockRelay.js +56 -57
- package/dist/test/TestRelayServer.d.ts +6 -3
- package/dist/test/TestRelayServer.d.ts.map +1 -1
- package/dist/test/TestRelayServer.js +141 -122
- package/dist/test/mod.d.ts +3 -3
- package/dist/test/mod.d.ts.map +1 -1
- package/dist/test/mod.js +22 -19
- package/dist/test/mod.js.map +7 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/uploaders/BlossomUploader.d.ts +1 -1
- package/dist/uploaders/BlossomUploader.d.ts.map +1 -1
- package/dist/uploaders/BlossomUploader.js +69 -66
- package/dist/uploaders/NostrBuildUploader.d.ts +1 -2
- package/dist/uploaders/NostrBuildUploader.d.ts.map +1 -1
- package/dist/uploaders/NostrBuildUploader.js +61 -59
- package/dist/uploaders/mod.d.ts +2 -2
- package/dist/uploaders/mod.js +6 -3
- package/dist/uploaders/mod.js.map +7 -1
- package/dist/utils/CircularSet.d.ts +1 -1
- package/dist/utils/CircularSet.d.ts.map +1 -1
- package/dist/utils/CircularSet.js +26 -28
- package/dist/utils/Machina.js +35 -59
- package/dist/utils/N64.d.ts +1 -1
- package/dist/utils/N64.d.ts.map +1 -1
- package/dist/utils/N64.js +16 -18
- package/dist/utils/mod.d.ts +2 -2
- package/dist/utils/mod.js +6 -3
- package/dist/utils/mod.js.map +7 -1
- package/ln/LNURL.test.ts +70 -52
- package/ln/LNURL.ts +15 -15
- package/ln/mod.ts +3 -3
- package/mod.ts +14 -14
- package/package.json +5 -3
- package/test/ErrorRelay.test.ts +11 -10
- package/test/ErrorRelay.ts +17 -5
- package/test/MockRelay.test.ts +15 -8
- package/test/MockRelay.ts +3 -3
- package/test/TestRelayServer.ts +46 -17
- package/test/mod.ts +4 -4
- package/tsconfig.json +5 -2
- package/uploaders/BlossomUploader.test.ts +39 -22
- package/uploaders/BlossomUploader.ts +2 -2
- package/uploaders/NostrBuildUploader.test.ts +36 -18
- package/uploaders/NostrBuildUploader.ts +4 -4
- package/uploaders/mod.ts +2 -2
- package/utils/CircularSet.test.ts +5 -4
- package/utils/CircularSet.ts +3 -1
- package/utils/Machina.test.ts +30 -19
- package/utils/N64.test.ts +12 -11
- package/utils/N64.ts +2 -2
- package/utils/mod.ts +2 -2
- package/dist/BunkerURI.js.map +0 -1
- package/dist/NBrowserSigner.js.map +0 -1
- package/dist/NCache.js.map +0 -1
- package/dist/NConnectSigner.js.map +0 -1
- package/dist/NIP05.js.map +0 -1
- package/dist/NIP50.js.map +0 -1
- package/dist/NIP98.js.map +0 -1
- package/dist/NKinds.js.map +0 -1
- package/dist/NPool.js.map +0 -1
- package/dist/NRelay1.js.map +0 -1
- package/dist/NSchema.js.map +0 -1
- package/dist/NSecSigner.js.map +0 -1
- package/dist/NSet.js.map +0 -1
- package/dist/RelayError.js.map +0 -1
- package/dist/ln/LNURL.js.map +0 -1
- package/dist/ln/types/LNURLCallback.js.map +0 -1
- package/dist/ln/types/LNURLDetails.js.map +0 -1
- package/dist/test/ErrorRelay.js.map +0 -1
- package/dist/test/MockRelay.js.map +0 -1
- package/dist/test/TestRelayServer.js.map +0 -1
- package/dist/uploaders/BlossomUploader.js.map +0 -1
- package/dist/uploaders/NostrBuildUploader.js.map +0 -1
- package/dist/utils/CircularSet.js.map +0 -1
- package/dist/utils/Machina.js.map +0 -1
- package/dist/utils/N64.js.map +0 -1
package/NIP05.test.ts
CHANGED
|
@@ -1,67 +1,59 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import { deepStrictEqual, rejects } from "node:assert";
|
|
3
|
+
import sinon from "sinon";
|
|
3
4
|
|
|
4
|
-
import { NIP05 } from
|
|
5
|
+
import { NIP05 } from "./NIP05.ts";
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
const { default: nostrJson } = await import(
|
|
7
|
+
await test("NIP05.lookup", async () => {
|
|
8
|
+
const { default: nostrJson } = await import("../../fixtures/nostr.json", {
|
|
9
|
+
with: { type: "json" },
|
|
10
|
+
});
|
|
8
11
|
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
'fetch',
|
|
12
|
-
returnsNext([
|
|
13
|
-
Promise.resolve(new Response(JSON.stringify(nostrJson))),
|
|
14
|
-
]),
|
|
15
|
-
);
|
|
12
|
+
const fetchStub = sinon.stub(globalThis, "fetch");
|
|
13
|
+
fetchStub.resolves(new Response(JSON.stringify(nostrJson)));
|
|
16
14
|
|
|
17
|
-
const result = await NIP05.lookup(
|
|
15
|
+
const result = await NIP05.lookup("alex_at_gleasonator.com@mostr.pub", {
|
|
16
|
+
fetch: fetchStub,
|
|
17
|
+
});
|
|
18
18
|
|
|
19
19
|
const expected = {
|
|
20
|
-
pubkey:
|
|
21
|
-
relays: [
|
|
20
|
+
pubkey: "79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6",
|
|
21
|
+
relays: ["wss://relay.mostr.pub"],
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
deepStrictEqual(result, expected);
|
|
25
|
+
fetchStub.restore();
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
// https://github.com/nostrability/nostrability/issues/143#issuecomment-2565772246
|
|
29
|
-
|
|
30
|
-
const { default: nostrJson } = await import(
|
|
29
|
+
await test("NIP05.lookup with invalid values but valid profile pointer", async () => {
|
|
30
|
+
const { default: nostrJson } = await import("../../fixtures/lncal.json", {
|
|
31
|
+
with: { type: "json" },
|
|
32
|
+
});
|
|
31
33
|
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
'fetch',
|
|
35
|
-
returnsNext([
|
|
36
|
-
Promise.resolve(new Response(JSON.stringify(nostrJson))),
|
|
37
|
-
]),
|
|
38
|
-
);
|
|
34
|
+
const fetchStub = sinon.stub(globalThis, "fetch");
|
|
35
|
+
fetchStub.resolves(new Response(JSON.stringify(nostrJson)));
|
|
39
36
|
|
|
40
|
-
const result = await NIP05.lookup(
|
|
37
|
+
const result = await NIP05.lookup("elsat@lncal.com", { fetch: fetchStub });
|
|
41
38
|
|
|
42
39
|
const expected = {
|
|
43
|
-
pubkey:
|
|
40
|
+
pubkey: "17538dc2a62769d09443f18c37cbe358fab5bbf981173542aa7c5ff171ed77c4",
|
|
44
41
|
relays: undefined,
|
|
45
42
|
};
|
|
46
43
|
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
deepStrictEqual(result, expected);
|
|
45
|
+
fetchStub.restore();
|
|
49
46
|
});
|
|
50
47
|
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
Promise.resolve(new Response(JSON.stringify({ names: 'yolo' }))),
|
|
57
|
-
Promise.resolve(new Response(JSON.stringify({}))),
|
|
58
|
-
Promise.resolve(new Response(JSON.stringify([]))),
|
|
59
|
-
]),
|
|
60
|
-
);
|
|
48
|
+
await test("NIP05.lookup with invalid document", () => {
|
|
49
|
+
const fetchStub = sinon.stub(globalThis, "fetch");
|
|
50
|
+
fetchStub.onCall(0).resolves(new Response(JSON.stringify({ names: "yolo" })));
|
|
51
|
+
fetchStub.onCall(1).resolves(new Response(JSON.stringify({})));
|
|
52
|
+
fetchStub.onCall(2).resolves(new Response(JSON.stringify([])));
|
|
61
53
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
54
|
+
rejects(() => NIP05.lookup("alex@gleasonator.dev", { fetch: fetchStub }));
|
|
55
|
+
rejects(() => NIP05.lookup("alex@gleasonator.dev", { fetch: fetchStub }));
|
|
56
|
+
rejects(() => NIP05.lookup("alex@gleasonator.dev", { fetch: fetchStub }));
|
|
65
57
|
|
|
66
|
-
|
|
58
|
+
fetchStub.restore();
|
|
67
59
|
});
|
package/NIP05.ts
CHANGED
package/NIP50.test.ts
CHANGED
|
@@ -1,58 +1,59 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import { deepStrictEqual } from "node:assert";
|
|
2
3
|
|
|
3
|
-
import { NIP50 } from
|
|
4
|
+
import { NIP50 } from "./NIP50.ts";
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
await test("NIP50.parseInput", () => {
|
|
7
|
+
deepStrictEqual(NIP50.parseInput(""), []);
|
|
8
|
+
deepStrictEqual(NIP50.parseInput(" "), []);
|
|
9
|
+
deepStrictEqual(NIP50.parseInput("hello"), ["hello"]);
|
|
10
|
+
deepStrictEqual(NIP50.parseInput("hello world"), ["hello", "world"]);
|
|
11
|
+
deepStrictEqual(NIP50.parseInput('hello "world"'), ["hello", "world"]);
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
deepStrictEqual(
|
|
13
14
|
NIP50.parseInput('hello "world" "hello world"'),
|
|
14
|
-
[
|
|
15
|
+
["hello", "world", "hello world"],
|
|
15
16
|
);
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
NIP50.parseInput(
|
|
19
|
-
[{ key:
|
|
18
|
+
deepStrictEqual(
|
|
19
|
+
NIP50.parseInput("domain:gleasonator.dev"),
|
|
20
|
+
[{ key: "domain", value: "gleasonator.dev" }],
|
|
20
21
|
);
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
NIP50.parseInput(
|
|
24
|
-
[
|
|
23
|
+
deepStrictEqual(
|
|
24
|
+
NIP50.parseInput("domain: yolo"),
|
|
25
|
+
["domain:", "yolo"],
|
|
25
26
|
);
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
NIP50.parseInput(
|
|
29
|
-
[{ key:
|
|
28
|
+
deepStrictEqual(
|
|
29
|
+
NIP50.parseInput("domain:localhost:8000"),
|
|
30
|
+
[{ key: "domain", value: "localhost:8000" }],
|
|
30
31
|
);
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
deepStrictEqual(
|
|
33
34
|
NIP50.parseInput('name:John "New York" age:30 hobbies:programming'),
|
|
34
35
|
[
|
|
35
|
-
{ key:
|
|
36
|
-
|
|
37
|
-
{ key:
|
|
38
|
-
{ key:
|
|
36
|
+
{ key: "name", value: "John" },
|
|
37
|
+
"New York",
|
|
38
|
+
{ key: "age", value: "30" },
|
|
39
|
+
{ key: "hobbies", value: "programming" },
|
|
39
40
|
],
|
|
40
41
|
);
|
|
41
42
|
});
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
NIP50.parseInput(
|
|
46
|
-
[{ key:
|
|
44
|
+
await test("NIP50.parseInput with negated token", () => {
|
|
45
|
+
deepStrictEqual(
|
|
46
|
+
NIP50.parseInput("-reply:true"),
|
|
47
|
+
[{ key: "-reply", value: "true" }],
|
|
47
48
|
);
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
NIP50.parseInput(
|
|
51
|
-
[
|
|
50
|
+
deepStrictEqual(
|
|
51
|
+
NIP50.parseInput("hello -reply:true"),
|
|
52
|
+
["hello", { key: "-reply", value: "true" }],
|
|
52
53
|
);
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
NIP50.parseInput(
|
|
56
|
-
[{ key:
|
|
55
|
+
deepStrictEqual(
|
|
56
|
+
NIP50.parseInput("-media:true -reply:true"),
|
|
57
|
+
[{ key: "-media", value: "true" }, { key: "-reply", value: "true" }],
|
|
57
58
|
);
|
|
58
59
|
});
|
package/NIP98.test.ts
CHANGED
|
@@ -1,181 +1,194 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import { deepStrictEqual, rejects } from "node:assert";
|
|
3
|
+
import { generateSecretKey } from "nostr-tools";
|
|
4
|
+
import { ZodError } from "zod";
|
|
4
5
|
|
|
5
|
-
import { NIP98 } from
|
|
6
|
-
import { NSecSigner } from
|
|
7
|
-
import { N64 } from
|
|
6
|
+
import { NIP98 } from "./NIP98.ts";
|
|
7
|
+
import { NSecSigner } from "./NSecSigner.ts";
|
|
8
|
+
import { N64 } from "./utils/mod.ts";
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
const request = new Request(
|
|
10
|
+
await test("NIP98.template", async () => {
|
|
11
|
+
const request = new Request("https://example.com");
|
|
11
12
|
const event = await NIP98.template(request);
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
[
|
|
16
|
-
[
|
|
14
|
+
deepStrictEqual(event.kind, 27235);
|
|
15
|
+
deepStrictEqual(event.tags, [
|
|
16
|
+
["method", "GET"],
|
|
17
|
+
["u", "https://example.com/"],
|
|
17
18
|
]);
|
|
18
19
|
});
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
const request = new Request(
|
|
22
|
-
method:
|
|
23
|
-
body:
|
|
21
|
+
await test("NIP98.template with payload", async () => {
|
|
22
|
+
const request = new Request("https://example.com", {
|
|
23
|
+
method: "POST",
|
|
24
|
+
body: "Hello, world!",
|
|
24
25
|
});
|
|
25
26
|
const event = await NIP98.template(request);
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
[
|
|
30
|
-
[
|
|
31
|
-
[
|
|
28
|
+
deepStrictEqual(event.kind, 27235);
|
|
29
|
+
deepStrictEqual(event.tags, [
|
|
30
|
+
["method", "POST"],
|
|
31
|
+
["u", "https://example.com/"],
|
|
32
|
+
[
|
|
33
|
+
"payload",
|
|
34
|
+
"315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3",
|
|
35
|
+
],
|
|
32
36
|
]);
|
|
33
37
|
});
|
|
34
38
|
|
|
35
|
-
|
|
39
|
+
await test("NIP98.verify", async () => {
|
|
36
40
|
const signer = new NSecSigner(generateSecretKey());
|
|
37
|
-
const request = new Request(
|
|
41
|
+
const request = new Request("https://example.com");
|
|
38
42
|
|
|
39
43
|
const t = await NIP98.template(request);
|
|
40
44
|
const event = await signer.signEvent(t);
|
|
41
45
|
|
|
42
|
-
request.headers.set(
|
|
46
|
+
request.headers.set("authorization", `Nostr ${N64.encodeEvent(event)}`);
|
|
43
47
|
|
|
44
48
|
const proof = await NIP98.verify(request);
|
|
45
49
|
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
deepStrictEqual(proof, event);
|
|
51
|
+
deepStrictEqual(proof.pubkey, await signer.getPublicKey());
|
|
48
52
|
});
|
|
49
53
|
|
|
50
|
-
|
|
51
|
-
const request = new Request(
|
|
54
|
+
await test("NIP98.verify fails with missing header", async () => {
|
|
55
|
+
const request = new Request("https://example.com");
|
|
52
56
|
|
|
53
|
-
await
|
|
57
|
+
await rejects(
|
|
54
58
|
() => NIP98.verify(request),
|
|
55
59
|
Error,
|
|
56
|
-
|
|
60
|
+
"Missing Nostr authorization header",
|
|
57
61
|
);
|
|
58
62
|
});
|
|
59
63
|
|
|
60
|
-
|
|
61
|
-
const request = new Request(
|
|
62
|
-
request.headers.set(
|
|
64
|
+
await test("NIP98.verify fails with missing token", async () => {
|
|
65
|
+
const request = new Request("https://example.com");
|
|
66
|
+
request.headers.set("authorization", "Nostr");
|
|
63
67
|
|
|
64
|
-
await
|
|
68
|
+
await rejects(
|
|
65
69
|
() => NIP98.verify(request),
|
|
66
70
|
Error,
|
|
67
|
-
|
|
71
|
+
"Missing Nostr authorization token",
|
|
68
72
|
);
|
|
69
73
|
});
|
|
70
74
|
|
|
71
|
-
|
|
72
|
-
const request = new Request(
|
|
73
|
-
request.headers.set(
|
|
75
|
+
await test("NIP98.verify fails with invalid token", async () => {
|
|
76
|
+
const request = new Request("https://example.com");
|
|
77
|
+
request.headers.set("authorization", "Nostr invalid");
|
|
74
78
|
|
|
75
|
-
await
|
|
79
|
+
await rejects(
|
|
76
80
|
() => NIP98.verify(request),
|
|
77
81
|
ZodError,
|
|
78
82
|
);
|
|
79
83
|
});
|
|
80
84
|
|
|
81
|
-
|
|
85
|
+
await test("NIP98.verify fails with invalid event", async () => {
|
|
82
86
|
const signer = new NSecSigner(generateSecretKey());
|
|
83
|
-
const request = new Request(
|
|
87
|
+
const request = new Request("https://example.com");
|
|
84
88
|
|
|
85
89
|
const t = await NIP98.template(request);
|
|
86
90
|
const event = await signer.signEvent(t);
|
|
87
91
|
|
|
88
|
-
event.sig =
|
|
92
|
+
event.sig = "invalid";
|
|
89
93
|
|
|
90
|
-
request.headers.set(
|
|
94
|
+
request.headers.set("authorization", `Nostr ${N64.encodeEvent(event)}`);
|
|
91
95
|
|
|
92
|
-
await
|
|
96
|
+
await rejects(
|
|
93
97
|
() => NIP98.verify(request),
|
|
94
98
|
Error,
|
|
95
|
-
|
|
99
|
+
"Event signature is invalid",
|
|
96
100
|
);
|
|
97
101
|
});
|
|
98
102
|
|
|
99
|
-
|
|
103
|
+
await test("NIP98.verify fails with wrong event kind", async () => {
|
|
100
104
|
const signer = new NSecSigner(generateSecretKey());
|
|
101
|
-
const request = new Request(
|
|
105
|
+
const request = new Request("https://example.com");
|
|
102
106
|
|
|
103
107
|
const t = await NIP98.template(request);
|
|
104
108
|
const event = await signer.signEvent({ ...t, kind: 1 });
|
|
105
109
|
|
|
106
|
-
request.headers.set(
|
|
110
|
+
request.headers.set("authorization", `Nostr ${N64.encodeEvent(event)}`);
|
|
107
111
|
|
|
108
|
-
await
|
|
112
|
+
await rejects(
|
|
109
113
|
() => NIP98.verify(request),
|
|
110
114
|
Error,
|
|
111
|
-
|
|
115
|
+
"Event must be kind 27235",
|
|
112
116
|
);
|
|
113
117
|
});
|
|
114
118
|
|
|
115
|
-
|
|
119
|
+
await test("NIP98.verify fails with wrong request URL", async () => {
|
|
116
120
|
const signer = new NSecSigner(generateSecretKey());
|
|
117
|
-
const request = new Request(
|
|
121
|
+
const request = new Request("https://example.com");
|
|
118
122
|
|
|
119
123
|
const t = await NIP98.template(request);
|
|
120
|
-
const event = await signer.signEvent({
|
|
124
|
+
const event = await signer.signEvent({
|
|
125
|
+
...t,
|
|
126
|
+
tags: [["u", "https://example.org/"]],
|
|
127
|
+
});
|
|
121
128
|
|
|
122
|
-
request.headers.set(
|
|
129
|
+
request.headers.set("authorization", `Nostr ${N64.encodeEvent(event)}`);
|
|
123
130
|
|
|
124
|
-
await
|
|
131
|
+
await rejects(
|
|
125
132
|
() => NIP98.verify(request),
|
|
126
133
|
Error,
|
|
127
|
-
|
|
134
|
+
"Event URL does not match request URL",
|
|
128
135
|
);
|
|
129
136
|
});
|
|
130
137
|
|
|
131
|
-
|
|
138
|
+
await test("NIP98.verify fails with wrong request method", async () => {
|
|
132
139
|
const signer = new NSecSigner(generateSecretKey());
|
|
133
|
-
const request = new Request(
|
|
140
|
+
const request = new Request("https://example.com");
|
|
134
141
|
|
|
135
142
|
const t = await NIP98.template(request);
|
|
136
|
-
const event = await signer.signEvent({
|
|
143
|
+
const event = await signer.signEvent({
|
|
144
|
+
...t,
|
|
145
|
+
tags: [["u", "https://example.com/"], ["method", "POST"]],
|
|
146
|
+
});
|
|
137
147
|
|
|
138
|
-
request.headers.set(
|
|
148
|
+
request.headers.set("authorization", `Nostr ${N64.encodeEvent(event)}`);
|
|
139
149
|
|
|
140
|
-
await
|
|
150
|
+
await rejects(
|
|
141
151
|
() => NIP98.verify(request),
|
|
142
152
|
Error,
|
|
143
|
-
|
|
153
|
+
"Event method does not match HTTP request method",
|
|
144
154
|
);
|
|
145
155
|
});
|
|
146
156
|
|
|
147
|
-
|
|
157
|
+
await test("NIP98.verify fails with expired event", async () => {
|
|
148
158
|
const signer = new NSecSigner(generateSecretKey());
|
|
149
|
-
const request = new Request(
|
|
159
|
+
const request = new Request("https://example.com");
|
|
150
160
|
|
|
151
161
|
const t = await NIP98.template(request);
|
|
152
162
|
const event = await signer.signEvent({ ...t, created_at: 0 });
|
|
153
163
|
|
|
154
|
-
request.headers.set(
|
|
164
|
+
request.headers.set("authorization", `Nostr ${N64.encodeEvent(event)}`);
|
|
155
165
|
|
|
156
|
-
await
|
|
166
|
+
await rejects(
|
|
157
167
|
() => NIP98.verify(request),
|
|
158
168
|
Error,
|
|
159
|
-
|
|
169
|
+
"Event expired",
|
|
160
170
|
);
|
|
161
171
|
});
|
|
162
172
|
|
|
163
|
-
|
|
173
|
+
await test("NIP98.verify fails with invalid payload", async () => {
|
|
164
174
|
const signer = new NSecSigner(generateSecretKey());
|
|
165
|
-
const request = new Request(
|
|
166
|
-
method:
|
|
167
|
-
body:
|
|
175
|
+
const request = new Request("https://example.com", {
|
|
176
|
+
method: "POST",
|
|
177
|
+
body: "Hello, world!",
|
|
168
178
|
});
|
|
169
179
|
|
|
170
180
|
const t = await NIP98.template(request);
|
|
171
|
-
const tags = t.tags.filter(([name]) => name !==
|
|
172
|
-
const event = await signer.signEvent({
|
|
181
|
+
const tags = t.tags.filter(([name]) => name !== "payload");
|
|
182
|
+
const event = await signer.signEvent({
|
|
183
|
+
...t,
|
|
184
|
+
tags: [...tags, ["payload", "invalid"]],
|
|
185
|
+
});
|
|
173
186
|
|
|
174
|
-
request.headers.set(
|
|
187
|
+
request.headers.set("authorization", `Nostr ${N64.encodeEvent(event)}`);
|
|
175
188
|
|
|
176
|
-
await
|
|
189
|
+
await rejects(
|
|
177
190
|
() => NIP98.verify(request),
|
|
178
191
|
Error,
|
|
179
|
-
|
|
192
|
+
"Event payload does not match request body",
|
|
180
193
|
);
|
|
181
194
|
});
|
package/NIP98.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { NostrEvent } from '@nostrify/types';
|
|
1
|
+
import type { NostrEvent } from '@nostrify/types';
|
|
2
2
|
import { encodeHex } from '@std/encoding/hex';
|
|
3
3
|
import { verifyEvent as _verifyEvent } from 'nostr-tools';
|
|
4
4
|
|
|
5
|
-
import { N64 } from './utils/N64.
|
|
5
|
+
import { N64 } from './utils/N64.ts';
|
|
6
6
|
|
|
7
7
|
/** [NIP-98](https://github.com/nostr-protocol/nips/blob/master/98.md) HTTP auth. */
|
|
8
8
|
export class NIP98 {
|
package/NKinds.test.ts
CHANGED
|
@@ -1,42 +1,43 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import { deepStrictEqual } from "node:assert";
|
|
2
3
|
|
|
3
|
-
import { NKinds } from
|
|
4
|
+
import { NKinds } from "./NKinds.ts";
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
await test("NKinds", () => {
|
|
7
|
+
deepStrictEqual(NKinds.regular(1000), true);
|
|
8
|
+
deepStrictEqual(NKinds.regular(10000), false);
|
|
9
|
+
deepStrictEqual(NKinds.regular(0), false);
|
|
10
|
+
deepStrictEqual(NKinds.regular(44), true);
|
|
11
|
+
deepStrictEqual(NKinds.regular(45), false);
|
|
12
|
+
deepStrictEqual(NKinds.regular(100000), false);
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
deepStrictEqual(NKinds.replaceable(1000), false);
|
|
15
|
+
deepStrictEqual(NKinds.replaceable(10000), true);
|
|
16
|
+
deepStrictEqual(NKinds.replaceable(0), true);
|
|
17
|
+
deepStrictEqual(NKinds.replaceable(3), true);
|
|
18
|
+
deepStrictEqual(NKinds.replaceable(44), false);
|
|
19
|
+
deepStrictEqual(NKinds.replaceable(45), false);
|
|
20
|
+
deepStrictEqual(NKinds.replaceable(100000), false);
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
deepStrictEqual(NKinds.ephemeral(1000), false);
|
|
23
|
+
deepStrictEqual(NKinds.ephemeral(10000), false);
|
|
24
|
+
deepStrictEqual(NKinds.ephemeral(0), false);
|
|
25
|
+
deepStrictEqual(NKinds.ephemeral(3), false);
|
|
26
|
+
deepStrictEqual(NKinds.ephemeral(44), false);
|
|
27
|
+
deepStrictEqual(NKinds.ephemeral(45), false);
|
|
28
|
+
deepStrictEqual(NKinds.ephemeral(20000), true);
|
|
29
|
+
deepStrictEqual(NKinds.ephemeral(30000), false);
|
|
30
|
+
deepStrictEqual(NKinds.ephemeral(40000), false);
|
|
31
|
+
deepStrictEqual(NKinds.ephemeral(100000), false);
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
deepStrictEqual(NKinds.addressable(1000), false);
|
|
34
|
+
deepStrictEqual(NKinds.addressable(10000), false);
|
|
35
|
+
deepStrictEqual(NKinds.addressable(0), false);
|
|
36
|
+
deepStrictEqual(NKinds.addressable(3), false);
|
|
37
|
+
deepStrictEqual(NKinds.addressable(44), false);
|
|
38
|
+
deepStrictEqual(NKinds.addressable(45), false);
|
|
39
|
+
deepStrictEqual(NKinds.addressable(20000), false);
|
|
40
|
+
deepStrictEqual(NKinds.addressable(30000), true);
|
|
41
|
+
deepStrictEqual(NKinds.addressable(40000), false);
|
|
42
|
+
deepStrictEqual(NKinds.addressable(100000), false);
|
|
42
43
|
});
|