@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,43 @@
1
+ export const template = `<template id="graffiti-login-welcome">
2
+ <h1>
3
+ <a target="_blank" href="https://graffiti.garden">Graffiti<wbr> Log In</a>
4
+ </h1>
5
+
6
+ <ul>
7
+ <li><a type="button" id="graffiti-login-new">Create new Graffiti identity</a></li>
8
+ <li><button class="secondary" id="graffiti-login-existing">Use existing Graffiti identity</button></li>
9
+ </ul>
10
+
11
+ <aside>
12
+ This application is built with
13
+ <a target="_blank" href="https://graffiti.garden">Graffiti</a>.
14
+ </aside>
15
+ </template>
16
+
17
+ <template id="graffiti-login-handle">
18
+ <h1>
19
+ <a target="_blank" href="https://graffiti.garden">Graffiti<wbr> Log In</a>
20
+ </h1>
21
+
22
+ <form id="graffiti-login-handle-form">
23
+ <label for="username">Enter your Graffiti handle:</label>
24
+ <input
25
+ type="text"
26
+ name="username"
27
+ id="username"
28
+ autocomplete="username"
29
+ autocapitalize="none"
30
+ spellcheck="false"
31
+ inputmode="url"
32
+ placeholder="example.graffiti.actor"
33
+ required
34
+ >
35
+ <button id="graffiti-login-handle-submit" type="submit">
36
+ Log In
37
+ </button>
38
+ </form>
39
+
40
+ <p>
41
+ Don't have a Graffiti handle? <a id="graffiti-login-new">Create one</a>.
42
+ </p>
43
+ </template>`;
@@ -0,0 +1,158 @@
1
+ import type {
2
+ GraffitiLoginEvent,
3
+ GraffitiLogoutEvent,
4
+ GraffitiSession,
5
+ } from "@graffiti-garden/api";
6
+ import {
7
+ graffitiCRUDTests,
8
+ graffitiDiscoverTests,
9
+ graffitiMediaTests,
10
+ } from "@graffiti-garden/api/tests";
11
+ import { DecentralizedIdentifiers } from "./1-services/2-dids";
12
+ import { Authorization } from "./1-services/1-authorization";
13
+ import { StorageBuckets } from "./1-services/3-storage-buckets";
14
+ import { Inboxes } from "./1-services/4-inboxes";
15
+ import { Sessions } from "./3-protocol/1-sessions";
16
+ import { afterAll, describe } from "vitest";
17
+ import { Handles } from "./3-protocol/2-handles";
18
+ import { didTests } from "./1-services/2-dids-tests";
19
+ import { storageBucketTests } from "./1-services/3-storage-buckets-tests";
20
+ import { inboxTests } from "./1-services/4-inboxes-tests";
21
+ import { stringEncodingTests } from "./2-primitives/1-string-encoding-tests";
22
+ import { contentAddressesTests } from "./2-primitives/2-content-addresses-tests";
23
+ import { channelAttestationTests } from "./2-primitives/3-channel-attestations-tests";
24
+ import { allowedAttestationTests } from "./2-primitives/4-allowed-attestations-tests";
25
+ import { handleTests } from "./3-protocol/2-handles-tests";
26
+ import { objectEncodingTests } from "./3-protocol/3-object-encoding-tests";
27
+ import { GraffitiDecentralized } from "./3-protocol/4-graffiti";
28
+
29
+ describe("GraffitiDecentralized Tests", async () => {
30
+ // Initialize structures for log in/out
31
+ const dids = new DecentralizedIdentifiers();
32
+ const sessionMethods = new Sessions({
33
+ dids,
34
+ authorization: new Authorization(),
35
+ inboxes: new Inboxes(),
36
+ storageBuckets: new StorageBuckets(),
37
+ });
38
+ const handleMethods = new Handles({ dids });
39
+
40
+ // Login
41
+ const handles = [
42
+ "localhost%3A5173:app:handles:handle:test1",
43
+ "localhost%3A5173:app:handles:handle:test2",
44
+ ];
45
+ let sessions: GraffitiSession[] = [];
46
+ for (const handle of handles) {
47
+ sessions.push(await login(handle));
48
+ }
49
+ const resolvedSessions = sessions.map((s) => {
50
+ const resolved = sessionMethods.resolveSession(s);
51
+ if (!resolved) throw new Error("Error logging in");
52
+ return resolved;
53
+ });
54
+ // Logout on cleanup
55
+ afterAll(async () => {
56
+ for (const session of sessions) {
57
+ await logout(session.actor);
58
+ }
59
+ });
60
+
61
+ // Service tests
62
+ didTests();
63
+ storageBucketTests(
64
+ resolvedSessions[0].storageBucket.serviceEndpoint,
65
+ resolvedSessions[0].storageBucket.token,
66
+ );
67
+ inboxTests(
68
+ resolvedSessions[0].personalInbox.serviceEndpoint,
69
+ resolvedSessions[0].personalInbox.token,
70
+ );
71
+
72
+ // Primitive tests
73
+ stringEncodingTests();
74
+ contentAddressesTests();
75
+ channelAttestationTests();
76
+ allowedAttestationTests();
77
+
78
+ // Protocol tests
79
+ handleTests(handles[0]);
80
+ objectEncodingTests();
81
+
82
+ const useGraffiti = () => {
83
+ return new GraffitiDecentralized(
84
+ {
85
+ defaultInboxEndpoints: ["https://localhost:5173/i/shared"],
86
+ },
87
+ );
88
+ };
89
+ graffitiCRUDTests(
90
+ useGraffiti,
91
+ () => sessions[0],
92
+ () => sessions[1],
93
+ );
94
+ graffitiMediaTests(
95
+ useGraffiti,
96
+ () => sessions[0],
97
+ () => sessions[1],
98
+ );
99
+ graffitiDiscoverTests(
100
+ useGraffiti,
101
+ () => sessions[0],
102
+ () => sessions[1],
103
+ );
104
+
105
+ // How to log in/out vvv
106
+ async function login(handle: string) {
107
+ const actor = await handleMethods.handleToActor(handle);
108
+
109
+ return await new Promise<GraffitiSession>((resolve, reject) => {
110
+ const listener = (e: unknown) => {
111
+ if (!(e instanceof CustomEvent)) return;
112
+ const detail = e.detail as GraffitiLoginEvent["detail"];
113
+ if (detail.error) {
114
+ reject(detail.error);
115
+ } else {
116
+ resolve(detail.session);
117
+ }
118
+ };
119
+ sessionMethods.sessionEvents.addEventListener("login", listener);
120
+
121
+ setTimeout(
122
+ () => {
123
+ sessionMethods.sessionEvents.removeEventListener("login", listener);
124
+ reject(new Error("Authorization timed out"));
125
+ },
126
+ 5 * 60 * 1000,
127
+ ); // 5 minutes timeout
128
+
129
+ sessionMethods.login(actor);
130
+ });
131
+ }
132
+
133
+ async function logout(actor: string) {
134
+ return await new Promise<void>((resolve, reject) => {
135
+ const listener = (e: unknown) => {
136
+ if (!(e instanceof CustomEvent)) return;
137
+ const detail = e.detail as GraffitiLogoutEvent["detail"];
138
+
139
+ if (detail.error) {
140
+ reject(detail.error);
141
+ } else {
142
+ resolve();
143
+ }
144
+ };
145
+ sessionMethods.sessionEvents.addEventListener("logout", listener);
146
+
147
+ setTimeout(
148
+ () => {
149
+ sessionMethods.sessionEvents.removeEventListener("logout", listener);
150
+ reject(new Error("Logout timed out"));
151
+ },
152
+ 5 * 60 * 1000,
153
+ ); // 5 minutes timeout
154
+
155
+ sessionMethods.logout(actor);
156
+ });
157
+ }
158
+ });
package/src/index.ts ADDED
@@ -0,0 +1,16 @@
1
+ import { Graffiti, GraffitiRuntimeTypes } from "@graffiti-garden/api";
2
+ import {
3
+ GraffitiDecentralized as GraffitiDecentralized_,
4
+ type GraffitiDecentralizedOptions,
5
+ } from "./3-protocol/4-graffiti";
6
+
7
+ /**
8
+ * A decentralized implementation of the
9
+ * [Graffiti API](https://api.graffiti.garden/classes/Graffiti.html).
10
+ */
11
+ export class GraffitiDecentralized extends GraffitiRuntimeTypes {
12
+ constructor(options?: GraffitiDecentralizedOptions) {
13
+ const graffiti: Graffiti = new GraffitiDecentralized_(options);
14
+ super(graffiti);
15
+ }
16
+ }