@graffiti-garden/implementation-decentralized 0.0.1

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 (193) hide show
  1. package/LICENSE +674 -0
  2. package/dist/1-services/1-authorization.d.ts +37 -0
  3. package/dist/1-services/1-authorization.d.ts.map +1 -0
  4. package/dist/1-services/2-dids-tests.d.ts +2 -0
  5. package/dist/1-services/2-dids-tests.d.ts.map +1 -0
  6. package/dist/1-services/2-dids.d.ts +9 -0
  7. package/dist/1-services/2-dids.d.ts.map +1 -0
  8. package/dist/1-services/3-storage-buckets-tests.d.ts +2 -0
  9. package/dist/1-services/3-storage-buckets-tests.d.ts.map +1 -0
  10. package/dist/1-services/3-storage-buckets.d.ts +11 -0
  11. package/dist/1-services/3-storage-buckets.d.ts.map +1 -0
  12. package/dist/1-services/4-inboxes-tests.d.ts +2 -0
  13. package/dist/1-services/4-inboxes-tests.d.ts.map +1 -0
  14. package/dist/1-services/4-inboxes.d.ts +87 -0
  15. package/dist/1-services/4-inboxes.d.ts.map +1 -0
  16. package/dist/1-services/utilities.d.ts +7 -0
  17. package/dist/1-services/utilities.d.ts.map +1 -0
  18. package/dist/2-primitives/1-string-encoding-tests.d.ts +2 -0
  19. package/dist/2-primitives/1-string-encoding-tests.d.ts.map +1 -0
  20. package/dist/2-primitives/1-string-encoding.d.ts +6 -0
  21. package/dist/2-primitives/1-string-encoding.d.ts.map +1 -0
  22. package/dist/2-primitives/2-content-addresses-tests.d.ts +2 -0
  23. package/dist/2-primitives/2-content-addresses-tests.d.ts.map +1 -0
  24. package/dist/2-primitives/2-content-addresses.d.ts +8 -0
  25. package/dist/2-primitives/2-content-addresses.d.ts.map +1 -0
  26. package/dist/2-primitives/3-channel-attestations-tests.d.ts +2 -0
  27. package/dist/2-primitives/3-channel-attestations-tests.d.ts.map +1 -0
  28. package/dist/2-primitives/3-channel-attestations.d.ts +13 -0
  29. package/dist/2-primitives/3-channel-attestations.d.ts.map +1 -0
  30. package/dist/2-primitives/4-allowed-attestations-tests.d.ts +2 -0
  31. package/dist/2-primitives/4-allowed-attestations-tests.d.ts.map +1 -0
  32. package/dist/2-primitives/4-allowed-attestations.d.ts +9 -0
  33. package/dist/2-primitives/4-allowed-attestations.d.ts.map +1 -0
  34. package/dist/3-protocol/1-sessions.d.ts +81 -0
  35. package/dist/3-protocol/1-sessions.d.ts.map +1 -0
  36. package/dist/3-protocol/2-handles-tests.d.ts +2 -0
  37. package/dist/3-protocol/2-handles-tests.d.ts.map +1 -0
  38. package/dist/3-protocol/2-handles.d.ts +13 -0
  39. package/dist/3-protocol/2-handles.d.ts.map +1 -0
  40. package/dist/3-protocol/3-object-encoding-tests.d.ts +2 -0
  41. package/dist/3-protocol/3-object-encoding-tests.d.ts.map +1 -0
  42. package/dist/3-protocol/3-object-encoding.d.ts +43 -0
  43. package/dist/3-protocol/3-object-encoding.d.ts.map +1 -0
  44. package/dist/3-protocol/4-graffiti.d.ts +79 -0
  45. package/dist/3-protocol/4-graffiti.d.ts.map +1 -0
  46. package/dist/3-protocol/login-dialog.html.d.ts +2 -0
  47. package/dist/3-protocol/login-dialog.html.d.ts.map +1 -0
  48. package/dist/browser/ajv-QBSREQSI.js +9 -0
  49. package/dist/browser/ajv-QBSREQSI.js.map +7 -0
  50. package/dist/browser/build-BXWPS7VK.js +2 -0
  51. package/dist/browser/build-BXWPS7VK.js.map +7 -0
  52. package/dist/browser/chunk-RFBBAUMM.js +2 -0
  53. package/dist/browser/chunk-RFBBAUMM.js.map +7 -0
  54. package/dist/browser/graffiti-KV3G3O72-URO7SJIJ.js +2 -0
  55. package/dist/browser/graffiti-KV3G3O72-URO7SJIJ.js.map +7 -0
  56. package/dist/browser/index.js +16 -0
  57. package/dist/browser/index.js.map +7 -0
  58. package/dist/browser/login-dialog.html-XUWYDNNI.js +44 -0
  59. package/dist/browser/login-dialog.html-XUWYDNNI.js.map +7 -0
  60. package/dist/browser/rock-salt-LI7DAH66-KPFEBIBO.js +2 -0
  61. package/dist/browser/rock-salt-LI7DAH66-KPFEBIBO.js.map +7 -0
  62. package/dist/browser/style-YUTCEBZV-RWYJV575.js +287 -0
  63. package/dist/browser/style-YUTCEBZV-RWYJV575.js.map +7 -0
  64. package/dist/cjs/1-services/1-authorization.js +317 -0
  65. package/dist/cjs/1-services/1-authorization.js.map +7 -0
  66. package/dist/cjs/1-services/2-dids-tests.js +44 -0
  67. package/dist/cjs/1-services/2-dids-tests.js.map +7 -0
  68. package/dist/cjs/1-services/2-dids.js +47 -0
  69. package/dist/cjs/1-services/2-dids.js.map +7 -0
  70. package/dist/cjs/1-services/3-storage-buckets-tests.js +123 -0
  71. package/dist/cjs/1-services/3-storage-buckets-tests.js.map +7 -0
  72. package/dist/cjs/1-services/3-storage-buckets.js +148 -0
  73. package/dist/cjs/1-services/3-storage-buckets.js.map +7 -0
  74. package/dist/cjs/1-services/4-inboxes-tests.js +145 -0
  75. package/dist/cjs/1-services/4-inboxes-tests.js.map +7 -0
  76. package/dist/cjs/1-services/4-inboxes.js +539 -0
  77. package/dist/cjs/1-services/4-inboxes.js.map +7 -0
  78. package/dist/cjs/1-services/utilities.js +75 -0
  79. package/dist/cjs/1-services/utilities.js.map +7 -0
  80. package/dist/cjs/2-primitives/1-string-encoding-tests.js +50 -0
  81. package/dist/cjs/2-primitives/1-string-encoding-tests.js.map +7 -0
  82. package/dist/cjs/2-primitives/1-string-encoding.js +46 -0
  83. package/dist/cjs/2-primitives/1-string-encoding.js.map +7 -0
  84. package/dist/cjs/2-primitives/2-content-addresses-tests.js +62 -0
  85. package/dist/cjs/2-primitives/2-content-addresses-tests.js.map +7 -0
  86. package/dist/cjs/2-primitives/2-content-addresses.js +53 -0
  87. package/dist/cjs/2-primitives/2-content-addresses.js.map +7 -0
  88. package/dist/cjs/2-primitives/3-channel-attestations-tests.js +130 -0
  89. package/dist/cjs/2-primitives/3-channel-attestations-tests.js.map +7 -0
  90. package/dist/cjs/2-primitives/3-channel-attestations.js +84 -0
  91. package/dist/cjs/2-primitives/3-channel-attestations.js.map +7 -0
  92. package/dist/cjs/2-primitives/4-allowed-attestations-tests.js +96 -0
  93. package/dist/cjs/2-primitives/4-allowed-attestations-tests.js.map +7 -0
  94. package/dist/cjs/2-primitives/4-allowed-attestations.js +68 -0
  95. package/dist/cjs/2-primitives/4-allowed-attestations.js.map +7 -0
  96. package/dist/cjs/3-protocol/1-sessions.js +473 -0
  97. package/dist/cjs/3-protocol/1-sessions.js.map +7 -0
  98. package/dist/cjs/3-protocol/2-handles-tests.js +39 -0
  99. package/dist/cjs/3-protocol/2-handles-tests.js.map +7 -0
  100. package/dist/cjs/3-protocol/2-handles.js +65 -0
  101. package/dist/cjs/3-protocol/2-handles.js.map +7 -0
  102. package/dist/cjs/3-protocol/3-object-encoding-tests.js +253 -0
  103. package/dist/cjs/3-protocol/3-object-encoding-tests.js.map +7 -0
  104. package/dist/cjs/3-protocol/3-object-encoding.js +287 -0
  105. package/dist/cjs/3-protocol/3-object-encoding.js.map +7 -0
  106. package/dist/cjs/3-protocol/4-graffiti.js +937 -0
  107. package/dist/cjs/3-protocol/4-graffiti.js.map +7 -0
  108. package/dist/cjs/3-protocol/login-dialog.html.js +67 -0
  109. package/dist/cjs/3-protocol/login-dialog.html.js.map +7 -0
  110. package/dist/cjs/index.js +32 -0
  111. package/dist/cjs/index.js.map +7 -0
  112. package/dist/cjs/index.spec.js +130 -0
  113. package/dist/cjs/index.spec.js.map +7 -0
  114. package/dist/esm/1-services/1-authorization.js +304 -0
  115. package/dist/esm/1-services/1-authorization.js.map +7 -0
  116. package/dist/esm/1-services/2-dids-tests.js +24 -0
  117. package/dist/esm/1-services/2-dids-tests.js.map +7 -0
  118. package/dist/esm/1-services/2-dids.js +27 -0
  119. package/dist/esm/1-services/2-dids.js.map +7 -0
  120. package/dist/esm/1-services/3-storage-buckets-tests.js +103 -0
  121. package/dist/esm/1-services/3-storage-buckets-tests.js.map +7 -0
  122. package/dist/esm/1-services/3-storage-buckets.js +132 -0
  123. package/dist/esm/1-services/3-storage-buckets.js.map +7 -0
  124. package/dist/esm/1-services/4-inboxes-tests.js +125 -0
  125. package/dist/esm/1-services/4-inboxes-tests.js.map +7 -0
  126. package/dist/esm/1-services/4-inboxes.js +533 -0
  127. package/dist/esm/1-services/4-inboxes.js.map +7 -0
  128. package/dist/esm/1-services/utilities.js +60 -0
  129. package/dist/esm/1-services/utilities.js.map +7 -0
  130. package/dist/esm/2-primitives/1-string-encoding-tests.js +33 -0
  131. package/dist/esm/2-primitives/1-string-encoding-tests.js.map +7 -0
  132. package/dist/esm/2-primitives/1-string-encoding.js +26 -0
  133. package/dist/esm/2-primitives/1-string-encoding.js.map +7 -0
  134. package/dist/esm/2-primitives/2-content-addresses-tests.js +45 -0
  135. package/dist/esm/2-primitives/2-content-addresses-tests.js.map +7 -0
  136. package/dist/esm/2-primitives/2-content-addresses.js +33 -0
  137. package/dist/esm/2-primitives/2-content-addresses.js.map +7 -0
  138. package/dist/esm/2-primitives/3-channel-attestations-tests.js +116 -0
  139. package/dist/esm/2-primitives/3-channel-attestations-tests.js.map +7 -0
  140. package/dist/esm/2-primitives/3-channel-attestations.js +69 -0
  141. package/dist/esm/2-primitives/3-channel-attestations.js.map +7 -0
  142. package/dist/esm/2-primitives/4-allowed-attestations-tests.js +82 -0
  143. package/dist/esm/2-primitives/4-allowed-attestations-tests.js.map +7 -0
  144. package/dist/esm/2-primitives/4-allowed-attestations.js +51 -0
  145. package/dist/esm/2-primitives/4-allowed-attestations.js.map +7 -0
  146. package/dist/esm/3-protocol/1-sessions.js +465 -0
  147. package/dist/esm/3-protocol/1-sessions.js.map +7 -0
  148. package/dist/esm/3-protocol/2-handles-tests.js +19 -0
  149. package/dist/esm/3-protocol/2-handles-tests.js.map +7 -0
  150. package/dist/esm/3-protocol/2-handles.js +45 -0
  151. package/dist/esm/3-protocol/2-handles.js.map +7 -0
  152. package/dist/esm/3-protocol/3-object-encoding-tests.js +248 -0
  153. package/dist/esm/3-protocol/3-object-encoding-tests.js.map +7 -0
  154. package/dist/esm/3-protocol/3-object-encoding.js +280 -0
  155. package/dist/esm/3-protocol/3-object-encoding.js.map +7 -0
  156. package/dist/esm/3-protocol/4-graffiti.js +957 -0
  157. package/dist/esm/3-protocol/4-graffiti.js.map +7 -0
  158. package/dist/esm/3-protocol/login-dialog.html.js +47 -0
  159. package/dist/esm/3-protocol/login-dialog.html.js.map +7 -0
  160. package/dist/esm/index.js +14 -0
  161. package/dist/esm/index.js.map +7 -0
  162. package/dist/esm/index.spec.js +133 -0
  163. package/dist/esm/index.spec.js.map +7 -0
  164. package/dist/index.d.ts +10 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.spec.d.ts +2 -0
  167. package/dist/index.spec.d.ts.map +1 -0
  168. package/package.json +62 -0
  169. package/src/1-services/1-authorization.ts +399 -0
  170. package/src/1-services/2-dids-tests.ts +24 -0
  171. package/src/1-services/2-dids.ts +30 -0
  172. package/src/1-services/3-storage-buckets-tests.ts +121 -0
  173. package/src/1-services/3-storage-buckets.ts +183 -0
  174. package/src/1-services/4-inboxes-tests.ts +154 -0
  175. package/src/1-services/4-inboxes.ts +722 -0
  176. package/src/1-services/utilities.ts +65 -0
  177. package/src/2-primitives/1-string-encoding-tests.ts +33 -0
  178. package/src/2-primitives/1-string-encoding.ts +33 -0
  179. package/src/2-primitives/2-content-addresses-tests.ts +46 -0
  180. package/src/2-primitives/2-content-addresses.ts +42 -0
  181. package/src/2-primitives/3-channel-attestations-tests.ts +125 -0
  182. package/src/2-primitives/3-channel-attestations.ts +95 -0
  183. package/src/2-primitives/4-allowed-attestations-tests.ts +86 -0
  184. package/src/2-primitives/4-allowed-attestations.ts +69 -0
  185. package/src/3-protocol/1-sessions.ts +601 -0
  186. package/src/3-protocol/2-handles-tests.ts +17 -0
  187. package/src/3-protocol/2-handles.ts +60 -0
  188. package/src/3-protocol/3-object-encoding-tests.ts +269 -0
  189. package/src/3-protocol/3-object-encoding.ts +396 -0
  190. package/src/3-protocol/4-graffiti.ts +1265 -0
  191. package/src/3-protocol/login-dialog.html.ts +43 -0
  192. package/src/index.spec.ts +158 -0
  193. package/src/index.ts +16 -0
@@ -0,0 +1,183 @@
1
+ import {
2
+ fetchWithErrorHandling,
3
+ getAuthorizationEndpoint,
4
+ verifyHTTPSEndpoint,
5
+ } from "./utilities";
6
+ import { string, array, object, optional, nullable } from "zod/mini";
7
+ import { decode as dagCborDecode } from "@ipld/dag-cbor";
8
+
9
+ export class StorageBuckets {
10
+ getAuthorizationEndpoint = getAuthorizationEndpoint;
11
+
12
+ async put(
13
+ storageBucketEndpoint: string,
14
+ key: string,
15
+ value: Uint8Array,
16
+ authorizationToken: string,
17
+ ): Promise<void> {
18
+ verifyHTTPSEndpoint(storageBucketEndpoint);
19
+ const url = `${storageBucketEndpoint}/value/${encodeURIComponent(key)}`;
20
+
21
+ await fetchWithErrorHandling(url, {
22
+ method: "PUT",
23
+ headers: {
24
+ "Content-Type": "application/octet-stream",
25
+ Authorization: `Bearer ${authorizationToken}`,
26
+ },
27
+ body: value.slice(),
28
+ });
29
+ }
30
+
31
+ async delete(
32
+ storageBucketEndpoint: string,
33
+ key: string,
34
+ authorizationToken: string,
35
+ ): Promise<void> {
36
+ verifyHTTPSEndpoint(storageBucketEndpoint);
37
+ const url = `${storageBucketEndpoint}/value/${encodeURIComponent(key)}`;
38
+
39
+ await fetchWithErrorHandling(url, {
40
+ method: "DELETE",
41
+ headers: {
42
+ Authorization: `Bearer ${authorizationToken}`,
43
+ },
44
+ });
45
+ }
46
+
47
+ async get(
48
+ storageBucketEndpoint: string,
49
+ key: string,
50
+ maxBytes?: number,
51
+ ): Promise<Uint8Array> {
52
+ verifyHTTPSEndpoint(storageBucketEndpoint);
53
+ const url = `${storageBucketEndpoint}/value/${encodeURIComponent(key)}`;
54
+
55
+ const response = await fetchWithErrorHandling(url);
56
+
57
+ const reader = response.body?.getReader();
58
+ if (!reader) {
59
+ throw new Error("Failed to read value from storage bucket");
60
+ }
61
+
62
+ const contentLengthHeader = response.headers.get("Content-Length");
63
+ const parsedContentLength = contentLengthHeader
64
+ ? Number(contentLengthHeader)
65
+ : undefined;
66
+
67
+ const hasValidContentLength =
68
+ !!parsedContentLength &&
69
+ !!Number.isFinite(parsedContentLength) &&
70
+ parsedContentLength >= 0;
71
+
72
+ // Fast path: Content-Length exists and is valid
73
+ if (hasValidContentLength) {
74
+ const contentLength = parsedContentLength!;
75
+ if (maxBytes !== undefined && contentLength > maxBytes) {
76
+ throw new Error("Value exceeds maximum byte limit");
77
+ }
78
+
79
+ const out = new Uint8Array(contentLength);
80
+ let offset = 0;
81
+ let completed = false;
82
+
83
+ try {
84
+ while (offset <= out.length) {
85
+ const { done, value } = await reader.read();
86
+
87
+ if (done) {
88
+ completed = true;
89
+ break;
90
+ }
91
+ if (!value || value.length === 0) continue;
92
+
93
+ const nextOffset = offset + value.length;
94
+ if (nextOffset > out.length) {
95
+ throw new Error("Received more data than expected");
96
+ }
97
+
98
+ out.set(value, offset);
99
+ offset = nextOffset;
100
+ }
101
+ } finally {
102
+ reader.releaseLock();
103
+ }
104
+
105
+ if (!completed) {
106
+ throw new Error("Failed to read complete value from storage bucket");
107
+ }
108
+
109
+ return offset === contentLength ? out : out.slice(0, offset);
110
+ }
111
+
112
+ // Fallback path: no (usable) Content-Length
113
+ const chunks: Uint8Array[] = [];
114
+ let total = 0;
115
+
116
+ try {
117
+ while (true) {
118
+ const { done, value } = await reader.read();
119
+
120
+ if (done) break;
121
+ if (!value || value.length === 0) continue;
122
+
123
+ total += value.length;
124
+ if (maxBytes !== undefined && total > maxBytes) {
125
+ throw new Error("Value exceeds maximum byte limit");
126
+ }
127
+
128
+ // Copy because some implementations reuse the underlying buffer
129
+ chunks.push(value.slice());
130
+ }
131
+ } finally {
132
+ reader.releaseLock();
133
+ }
134
+
135
+ // Concatenate chunks into one Uint8Array
136
+ const out = new Uint8Array(total);
137
+ let offset = 0;
138
+ for (const c of chunks) {
139
+ out.set(c, offset);
140
+ offset += c.length;
141
+ }
142
+ return out;
143
+ }
144
+
145
+ async *export(
146
+ storageBucketEndpoint: string,
147
+ authorizationToken: string,
148
+ ): AsyncGenerator<{ key: string }> {
149
+ verifyHTTPSEndpoint(storageBucketEndpoint);
150
+ const url = `${storageBucketEndpoint}/export`;
151
+
152
+ let cursor: string | undefined = undefined;
153
+ while (true) {
154
+ const response = await fetchWithErrorHandling(
155
+ cursor ? `${url}?cursor=${encodeURIComponent(cursor)}` : url,
156
+ {
157
+ headers: {
158
+ Authorization: `Bearer ${authorizationToken}`,
159
+ },
160
+ },
161
+ );
162
+
163
+ const blob = await response.blob();
164
+ const cbor = dagCborDecode(await blob.arrayBuffer());
165
+ const data = ExportSchema.parse(cbor);
166
+
167
+ for (const key of data.keys) {
168
+ yield { key };
169
+ }
170
+
171
+ if (data.cursor) {
172
+ cursor = data.cursor;
173
+ } else {
174
+ break;
175
+ }
176
+ }
177
+ }
178
+ }
179
+
180
+ const ExportSchema = object({
181
+ keys: array(string()),
182
+ cursor: optional(nullable(string())),
183
+ });
@@ -0,0 +1,154 @@
1
+ import { assert, describe, expect, test } from "vitest";
2
+ import { Inboxes, LABELED_MESSAGE_LABEL_KEY } from "./4-inboxes";
3
+ import { GraffitiErrorUnauthorized } from "./utilities";
4
+ import { randomBytes } from "@noble/hashes/utils.js";
5
+ import type { GraffitiObjectBase } from "@graffiti-garden/api";
6
+
7
+ export function inboxTests(inboxEndpoint: string, inboxToken: string) {
8
+ describe("Inboxes", async () => {
9
+ const inboxes = new Inboxes();
10
+
11
+ test("send, get", async () => {
12
+ const tags = [randomBytes(), randomBytes()];
13
+ const metadata = randomBytes();
14
+ const object: GraffitiObjectBase = {
15
+ url: "url:example",
16
+ actor: "did:example",
17
+ channels: ["example", "something"],
18
+ value: {
19
+ nested: {
20
+ property: [1, "askdfj", null],
21
+ },
22
+ },
23
+ allowed: ["did:example2"],
24
+ };
25
+
26
+ const sending = {
27
+ m: metadata,
28
+ o: object,
29
+ t: tags,
30
+ };
31
+ const messageId = await inboxes.send(inboxEndpoint, sending);
32
+
33
+ // Get the message back
34
+ const message = await inboxes.get(inboxEndpoint, messageId, inboxToken);
35
+ expect(message.m).toEqual(sending);
36
+ expect(message.l).toEqual(0);
37
+
38
+ const iterator = inboxes.query<{}>(inboxEndpoint, tags, {}, inboxToken);
39
+
40
+ const result = await iterator.next();
41
+ assert(!result.done);
42
+
43
+ // No label yet so it must be zero
44
+ expect(result.value.l).toEqual(0);
45
+
46
+ expect(result.value.m.t).toEqual(tags);
47
+ expect(result.value.m.o).toEqual(object);
48
+ expect(result.value.id).toEqual(messageId);
49
+
50
+ const endResult = await iterator.next();
51
+ expect(endResult.done).toBe(true);
52
+
53
+ // Label the message
54
+ await inboxes.label(inboxEndpoint, messageId, 42, inboxToken);
55
+
56
+ const iterator2 = inboxes.query<{}>(inboxEndpoint, tags, {}, inboxToken);
57
+
58
+ const result2 = await iterator2.next();
59
+ assert(!result2.done);
60
+ expect(result2.value.l).toEqual(42);
61
+ const endResult2 = await iterator2.next();
62
+ expect(endResult2.done).toBe(true);
63
+
64
+ const message2 = await inboxes.get(inboxEndpoint, messageId, inboxToken);
65
+ expect(message2.m).toEqual(sending);
66
+ expect(message2.l).toEqual(42);
67
+ });
68
+
69
+ test("query with continue", async () => {
70
+ const tags = [randomBytes(), randomBytes()];
71
+
72
+ const nullResult = await inboxes
73
+ .query<{}>(inboxEndpoint, tags, {}, inboxToken)
74
+ .next();
75
+ assert(nullResult.done);
76
+ const cursor = nullResult.value;
77
+
78
+ const metadata = randomBytes();
79
+
80
+ const messageId = await inboxes.send(inboxEndpoint, {
81
+ o: {
82
+ url: "url:example",
83
+ actor: "did:example",
84
+ channels: ["example", "something"],
85
+ value: {
86
+ nested: {
87
+ property: [1, "askdfj", null],
88
+ },
89
+ },
90
+ allowed: ["did:example2"],
91
+ },
92
+ t: [randomBytes(), tags[0]],
93
+ m: metadata,
94
+ });
95
+
96
+ const result = await inboxes
97
+ .continueQuery(inboxEndpoint, cursor, inboxToken)
98
+ .next();
99
+ assert(!result.done);
100
+ expect(result.value.id).toEqual(messageId);
101
+ });
102
+
103
+ test("unauthorized access", async () => {
104
+ const tags = [randomBytes()];
105
+
106
+ await expect(
107
+ inboxes.query(inboxEndpoint, tags, {}, "invalid-token").next(),
108
+ ).rejects.toThrowError(GraffitiErrorUnauthorized);
109
+ await expect(
110
+ inboxes.label(inboxEndpoint, "1", 1, "invalid-token"),
111
+ ).rejects.toThrowError(GraffitiErrorUnauthorized);
112
+ await expect(
113
+ inboxes.export(inboxEndpoint, "invalid-token").next(),
114
+ ).rejects.toThrowError(GraffitiErrorUnauthorized);
115
+ }, 30000);
116
+
117
+ test("query paged", async () => {
118
+ const tags = [randomBytes(), randomBytes()];
119
+
120
+ const numSends = 211;
121
+ for (let i = 0; i < numSends; i++) {
122
+ await inboxes.send(inboxEndpoint, {
123
+ t: tags,
124
+ m: randomBytes(),
125
+ o: {
126
+ url: "url:example",
127
+ actor: "did:example",
128
+ channels: ["example", "something"],
129
+ value: {
130
+ nested: {
131
+ property: [1, "askdfj", null],
132
+ },
133
+ },
134
+ allowed: ["did:example2"],
135
+ },
136
+ });
137
+ }
138
+
139
+ const iterator = inboxes.query(
140
+ inboxEndpoint,
141
+ [randomBytes(), tags[1], randomBytes()],
142
+ {},
143
+ inboxToken,
144
+ );
145
+
146
+ let count = 0;
147
+ for await (const _ of iterator) {
148
+ count++;
149
+ }
150
+
151
+ expect(count).toBe(numSends);
152
+ }, 100000);
153
+ });
154
+ }