@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.
- package/LICENSE +674 -0
- package/dist/1-services/1-authorization.d.ts +37 -0
- package/dist/1-services/1-authorization.d.ts.map +1 -0
- package/dist/1-services/2-dids-tests.d.ts +2 -0
- package/dist/1-services/2-dids-tests.d.ts.map +1 -0
- package/dist/1-services/2-dids.d.ts +9 -0
- package/dist/1-services/2-dids.d.ts.map +1 -0
- package/dist/1-services/3-storage-buckets-tests.d.ts +2 -0
- package/dist/1-services/3-storage-buckets-tests.d.ts.map +1 -0
- package/dist/1-services/3-storage-buckets.d.ts +11 -0
- package/dist/1-services/3-storage-buckets.d.ts.map +1 -0
- package/dist/1-services/4-inboxes-tests.d.ts +2 -0
- package/dist/1-services/4-inboxes-tests.d.ts.map +1 -0
- package/dist/1-services/4-inboxes.d.ts +87 -0
- package/dist/1-services/4-inboxes.d.ts.map +1 -0
- package/dist/1-services/utilities.d.ts +7 -0
- package/dist/1-services/utilities.d.ts.map +1 -0
- package/dist/2-primitives/1-string-encoding-tests.d.ts +2 -0
- package/dist/2-primitives/1-string-encoding-tests.d.ts.map +1 -0
- package/dist/2-primitives/1-string-encoding.d.ts +6 -0
- package/dist/2-primitives/1-string-encoding.d.ts.map +1 -0
- package/dist/2-primitives/2-content-addresses-tests.d.ts +2 -0
- package/dist/2-primitives/2-content-addresses-tests.d.ts.map +1 -0
- package/dist/2-primitives/2-content-addresses.d.ts +8 -0
- package/dist/2-primitives/2-content-addresses.d.ts.map +1 -0
- package/dist/2-primitives/3-channel-attestations-tests.d.ts +2 -0
- package/dist/2-primitives/3-channel-attestations-tests.d.ts.map +1 -0
- package/dist/2-primitives/3-channel-attestations.d.ts +13 -0
- package/dist/2-primitives/3-channel-attestations.d.ts.map +1 -0
- package/dist/2-primitives/4-allowed-attestations-tests.d.ts +2 -0
- package/dist/2-primitives/4-allowed-attestations-tests.d.ts.map +1 -0
- package/dist/2-primitives/4-allowed-attestations.d.ts +9 -0
- package/dist/2-primitives/4-allowed-attestations.d.ts.map +1 -0
- package/dist/3-protocol/1-sessions.d.ts +81 -0
- package/dist/3-protocol/1-sessions.d.ts.map +1 -0
- package/dist/3-protocol/2-handles-tests.d.ts +2 -0
- package/dist/3-protocol/2-handles-tests.d.ts.map +1 -0
- package/dist/3-protocol/2-handles.d.ts +13 -0
- package/dist/3-protocol/2-handles.d.ts.map +1 -0
- package/dist/3-protocol/3-object-encoding-tests.d.ts +2 -0
- package/dist/3-protocol/3-object-encoding-tests.d.ts.map +1 -0
- package/dist/3-protocol/3-object-encoding.d.ts +43 -0
- package/dist/3-protocol/3-object-encoding.d.ts.map +1 -0
- package/dist/3-protocol/4-graffiti.d.ts +79 -0
- package/dist/3-protocol/4-graffiti.d.ts.map +1 -0
- package/dist/3-protocol/login-dialog.html.d.ts +2 -0
- package/dist/3-protocol/login-dialog.html.d.ts.map +1 -0
- package/dist/browser/ajv-QBSREQSI.js +9 -0
- package/dist/browser/ajv-QBSREQSI.js.map +7 -0
- package/dist/browser/build-BXWPS7VK.js +2 -0
- package/dist/browser/build-BXWPS7VK.js.map +7 -0
- package/dist/browser/chunk-RFBBAUMM.js +2 -0
- package/dist/browser/chunk-RFBBAUMM.js.map +7 -0
- package/dist/browser/graffiti-KV3G3O72-URO7SJIJ.js +2 -0
- package/dist/browser/graffiti-KV3G3O72-URO7SJIJ.js.map +7 -0
- package/dist/browser/index.js +16 -0
- package/dist/browser/index.js.map +7 -0
- package/dist/browser/login-dialog.html-XUWYDNNI.js +44 -0
- package/dist/browser/login-dialog.html-XUWYDNNI.js.map +7 -0
- package/dist/browser/rock-salt-LI7DAH66-KPFEBIBO.js +2 -0
- package/dist/browser/rock-salt-LI7DAH66-KPFEBIBO.js.map +7 -0
- package/dist/browser/style-YUTCEBZV-RWYJV575.js +287 -0
- package/dist/browser/style-YUTCEBZV-RWYJV575.js.map +7 -0
- package/dist/cjs/1-services/1-authorization.js +317 -0
- package/dist/cjs/1-services/1-authorization.js.map +7 -0
- package/dist/cjs/1-services/2-dids-tests.js +44 -0
- package/dist/cjs/1-services/2-dids-tests.js.map +7 -0
- package/dist/cjs/1-services/2-dids.js +47 -0
- package/dist/cjs/1-services/2-dids.js.map +7 -0
- package/dist/cjs/1-services/3-storage-buckets-tests.js +123 -0
- package/dist/cjs/1-services/3-storage-buckets-tests.js.map +7 -0
- package/dist/cjs/1-services/3-storage-buckets.js +148 -0
- package/dist/cjs/1-services/3-storage-buckets.js.map +7 -0
- package/dist/cjs/1-services/4-inboxes-tests.js +145 -0
- package/dist/cjs/1-services/4-inboxes-tests.js.map +7 -0
- package/dist/cjs/1-services/4-inboxes.js +539 -0
- package/dist/cjs/1-services/4-inboxes.js.map +7 -0
- package/dist/cjs/1-services/utilities.js +75 -0
- package/dist/cjs/1-services/utilities.js.map +7 -0
- package/dist/cjs/2-primitives/1-string-encoding-tests.js +50 -0
- package/dist/cjs/2-primitives/1-string-encoding-tests.js.map +7 -0
- package/dist/cjs/2-primitives/1-string-encoding.js +46 -0
- package/dist/cjs/2-primitives/1-string-encoding.js.map +7 -0
- package/dist/cjs/2-primitives/2-content-addresses-tests.js +62 -0
- package/dist/cjs/2-primitives/2-content-addresses-tests.js.map +7 -0
- package/dist/cjs/2-primitives/2-content-addresses.js +53 -0
- package/dist/cjs/2-primitives/2-content-addresses.js.map +7 -0
- package/dist/cjs/2-primitives/3-channel-attestations-tests.js +130 -0
- package/dist/cjs/2-primitives/3-channel-attestations-tests.js.map +7 -0
- package/dist/cjs/2-primitives/3-channel-attestations.js +84 -0
- package/dist/cjs/2-primitives/3-channel-attestations.js.map +7 -0
- package/dist/cjs/2-primitives/4-allowed-attestations-tests.js +96 -0
- package/dist/cjs/2-primitives/4-allowed-attestations-tests.js.map +7 -0
- package/dist/cjs/2-primitives/4-allowed-attestations.js +68 -0
- package/dist/cjs/2-primitives/4-allowed-attestations.js.map +7 -0
- package/dist/cjs/3-protocol/1-sessions.js +473 -0
- package/dist/cjs/3-protocol/1-sessions.js.map +7 -0
- package/dist/cjs/3-protocol/2-handles-tests.js +39 -0
- package/dist/cjs/3-protocol/2-handles-tests.js.map +7 -0
- package/dist/cjs/3-protocol/2-handles.js +65 -0
- package/dist/cjs/3-protocol/2-handles.js.map +7 -0
- package/dist/cjs/3-protocol/3-object-encoding-tests.js +253 -0
- package/dist/cjs/3-protocol/3-object-encoding-tests.js.map +7 -0
- package/dist/cjs/3-protocol/3-object-encoding.js +287 -0
- package/dist/cjs/3-protocol/3-object-encoding.js.map +7 -0
- package/dist/cjs/3-protocol/4-graffiti.js +937 -0
- package/dist/cjs/3-protocol/4-graffiti.js.map +7 -0
- package/dist/cjs/3-protocol/login-dialog.html.js +67 -0
- package/dist/cjs/3-protocol/login-dialog.html.js.map +7 -0
- package/dist/cjs/index.js +32 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/index.spec.js +130 -0
- package/dist/cjs/index.spec.js.map +7 -0
- package/dist/esm/1-services/1-authorization.js +304 -0
- package/dist/esm/1-services/1-authorization.js.map +7 -0
- package/dist/esm/1-services/2-dids-tests.js +24 -0
- package/dist/esm/1-services/2-dids-tests.js.map +7 -0
- package/dist/esm/1-services/2-dids.js +27 -0
- package/dist/esm/1-services/2-dids.js.map +7 -0
- package/dist/esm/1-services/3-storage-buckets-tests.js +103 -0
- package/dist/esm/1-services/3-storage-buckets-tests.js.map +7 -0
- package/dist/esm/1-services/3-storage-buckets.js +132 -0
- package/dist/esm/1-services/3-storage-buckets.js.map +7 -0
- package/dist/esm/1-services/4-inboxes-tests.js +125 -0
- package/dist/esm/1-services/4-inboxes-tests.js.map +7 -0
- package/dist/esm/1-services/4-inboxes.js +533 -0
- package/dist/esm/1-services/4-inboxes.js.map +7 -0
- package/dist/esm/1-services/utilities.js +60 -0
- package/dist/esm/1-services/utilities.js.map +7 -0
- package/dist/esm/2-primitives/1-string-encoding-tests.js +33 -0
- package/dist/esm/2-primitives/1-string-encoding-tests.js.map +7 -0
- package/dist/esm/2-primitives/1-string-encoding.js +26 -0
- package/dist/esm/2-primitives/1-string-encoding.js.map +7 -0
- package/dist/esm/2-primitives/2-content-addresses-tests.js +45 -0
- package/dist/esm/2-primitives/2-content-addresses-tests.js.map +7 -0
- package/dist/esm/2-primitives/2-content-addresses.js +33 -0
- package/dist/esm/2-primitives/2-content-addresses.js.map +7 -0
- package/dist/esm/2-primitives/3-channel-attestations-tests.js +116 -0
- package/dist/esm/2-primitives/3-channel-attestations-tests.js.map +7 -0
- package/dist/esm/2-primitives/3-channel-attestations.js +69 -0
- package/dist/esm/2-primitives/3-channel-attestations.js.map +7 -0
- package/dist/esm/2-primitives/4-allowed-attestations-tests.js +82 -0
- package/dist/esm/2-primitives/4-allowed-attestations-tests.js.map +7 -0
- package/dist/esm/2-primitives/4-allowed-attestations.js +51 -0
- package/dist/esm/2-primitives/4-allowed-attestations.js.map +7 -0
- package/dist/esm/3-protocol/1-sessions.js +465 -0
- package/dist/esm/3-protocol/1-sessions.js.map +7 -0
- package/dist/esm/3-protocol/2-handles-tests.js +19 -0
- package/dist/esm/3-protocol/2-handles-tests.js.map +7 -0
- package/dist/esm/3-protocol/2-handles.js +45 -0
- package/dist/esm/3-protocol/2-handles.js.map +7 -0
- package/dist/esm/3-protocol/3-object-encoding-tests.js +248 -0
- package/dist/esm/3-protocol/3-object-encoding-tests.js.map +7 -0
- package/dist/esm/3-protocol/3-object-encoding.js +280 -0
- package/dist/esm/3-protocol/3-object-encoding.js.map +7 -0
- package/dist/esm/3-protocol/4-graffiti.js +957 -0
- package/dist/esm/3-protocol/4-graffiti.js.map +7 -0
- package/dist/esm/3-protocol/login-dialog.html.js +47 -0
- package/dist/esm/3-protocol/login-dialog.html.js.map +7 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/esm/index.spec.js +133 -0
- package/dist/esm/index.spec.js.map +7 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.spec.d.ts +2 -0
- package/dist/index.spec.d.ts.map +1 -0
- package/package.json +62 -0
- package/src/1-services/1-authorization.ts +399 -0
- package/src/1-services/2-dids-tests.ts +24 -0
- package/src/1-services/2-dids.ts +30 -0
- package/src/1-services/3-storage-buckets-tests.ts +121 -0
- package/src/1-services/3-storage-buckets.ts +183 -0
- package/src/1-services/4-inboxes-tests.ts +154 -0
- package/src/1-services/4-inboxes.ts +722 -0
- package/src/1-services/utilities.ts +65 -0
- package/src/2-primitives/1-string-encoding-tests.ts +33 -0
- package/src/2-primitives/1-string-encoding.ts +33 -0
- package/src/2-primitives/2-content-addresses-tests.ts +46 -0
- package/src/2-primitives/2-content-addresses.ts +42 -0
- package/src/2-primitives/3-channel-attestations-tests.ts +125 -0
- package/src/2-primitives/3-channel-attestations.ts +95 -0
- package/src/2-primitives/4-allowed-attestations-tests.ts +86 -0
- package/src/2-primitives/4-allowed-attestations.ts +69 -0
- package/src/3-protocol/1-sessions.ts +601 -0
- package/src/3-protocol/2-handles-tests.ts +17 -0
- package/src/3-protocol/2-handles.ts +60 -0
- package/src/3-protocol/3-object-encoding-tests.ts +269 -0
- package/src/3-protocol/3-object-encoding.ts +396 -0
- package/src/3-protocol/4-graffiti.ts +1265 -0
- package/src/3-protocol/login-dialog.html.ts +43 -0
- package/src/index.spec.ts +158 -0
- package/src/index.ts +16 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var dids_tests_exports = {};
|
|
20
|
+
__export(dids_tests_exports, {
|
|
21
|
+
didTests: () => didTests
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(dids_tests_exports);
|
|
24
|
+
var import_vitest = require("vitest");
|
|
25
|
+
var import_dids = require("./2-dids");
|
|
26
|
+
function didTests() {
|
|
27
|
+
return (0, import_vitest.describe)("DecentralizedIdentifiers", () => {
|
|
28
|
+
const dids = new import_dids.DecentralizedIdentifiers();
|
|
29
|
+
(0, import_vitest.test)("invalid method", async () => {
|
|
30
|
+
await (0, import_vitest.expect)(dids.resolve("did:invalid:12345")).rejects.toThrowError();
|
|
31
|
+
});
|
|
32
|
+
(0, import_vitest.test)("did:web", async () => {
|
|
33
|
+
const did = "did:web:identity.foundation";
|
|
34
|
+
const result = await dids.resolve(did);
|
|
35
|
+
(0, import_vitest.expect)(result).toHaveProperty("id", did);
|
|
36
|
+
});
|
|
37
|
+
(0, import_vitest.test)("did:plc", async () => {
|
|
38
|
+
const did = "did:plc:44ybard66vv44zksje25o7dz";
|
|
39
|
+
const result = await dids.resolve(did);
|
|
40
|
+
(0, import_vitest.expect)(result).toHaveProperty("id", did);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=2-dids-tests.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/1-services/2-dids-tests.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, test } from \"vitest\";\nimport { DecentralizedIdentifiers } from \"./2-dids\";\n\nexport function didTests() {\n return describe(\"DecentralizedIdentifiers\", () => {\n const dids = new DecentralizedIdentifiers();\n\n test(\"invalid method\", async () => {\n await expect(dids.resolve(\"did:invalid:12345\")).rejects.toThrowError();\n });\n\n test(\"did:web\", async () => {\n const did = \"did:web:identity.foundation\";\n const result = await dids.resolve(did);\n expect(result).toHaveProperty(\"id\", did);\n });\n\n test(\"did:plc\", async () => {\n const did = \"did:plc:44ybard66vv44zksje25o7dz\";\n const result = await dids.resolve(did);\n expect(result).toHaveProperty(\"id\", did);\n });\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuC;AACvC,kBAAyC;AAElC,SAAS,WAAW;AACzB,aAAO,wBAAS,4BAA4B,MAAM;AAChD,UAAM,OAAO,IAAI,qCAAyB;AAE1C,4BAAK,kBAAkB,YAAY;AACjC,gBAAM,sBAAO,KAAK,QAAQ,mBAAmB,CAAC,EAAE,QAAQ,aAAa;AAAA,IACvE,CAAC;AAED,4BAAK,WAAW,YAAY;AAC1B,YAAM,MAAM;AACZ,YAAM,SAAS,MAAM,KAAK,QAAQ,GAAG;AACrC,gCAAO,MAAM,EAAE,eAAe,MAAM,GAAG;AAAA,IACzC,CAAC;AAED,4BAAK,WAAW,YAAY;AAC1B,YAAM,MAAM;AACZ,YAAM,SAAS,MAAM,KAAK,QAAQ,GAAG;AACrC,gCAAO,MAAM,EAAE,eAAe,MAAM,GAAG;AAAA,IACzC,CAAC;AAAA,EACH,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var dids_exports = {};
|
|
20
|
+
__export(dids_exports, {
|
|
21
|
+
DecentralizedIdentifiers: () => DecentralizedIdentifiers
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(dids_exports);
|
|
24
|
+
var import_api = require("@graffiti-garden/api");
|
|
25
|
+
var import_did_resolver = require("did-resolver");
|
|
26
|
+
var import_plc_did_resolver = require("plc-did-resolver");
|
|
27
|
+
var import_web_did_resolver = require("web-did-resolver");
|
|
28
|
+
class DecentralizedIdentifiers {
|
|
29
|
+
methods = {
|
|
30
|
+
...(0, import_plc_did_resolver.getResolver)(),
|
|
31
|
+
...(0, import_web_did_resolver.getResolver)()
|
|
32
|
+
};
|
|
33
|
+
resolver = new import_did_resolver.Resolver(this.methods, { cache: true });
|
|
34
|
+
async resolve(did) {
|
|
35
|
+
if (!Object.keys(this.methods).some(
|
|
36
|
+
(method) => did.startsWith(`did:${method}:`)
|
|
37
|
+
)) {
|
|
38
|
+
throw new Error(`Unrecognized DID method: ${did}`);
|
|
39
|
+
}
|
|
40
|
+
const { didDocument } = await this.resolver.resolve(did);
|
|
41
|
+
if (!didDocument) {
|
|
42
|
+
throw new import_api.GraffitiErrorNotFound(`DID not found: ${did}`);
|
|
43
|
+
}
|
|
44
|
+
return didDocument;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=2-dids.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/1-services/2-dids.ts"],
|
|
4
|
+
"sourcesContent": ["import { GraffitiErrorNotFound } from \"@graffiti-garden/api\";\nimport { Resolver, type DIDDocument } from \"did-resolver\";\nimport { getResolver as plcResolver } from \"plc-did-resolver\";\nimport { getResolver as webResolver } from \"web-did-resolver\";\n\nexport class DecentralizedIdentifiers {\n protected readonly methods = {\n ...plcResolver(),\n ...webResolver(),\n };\n\n protected readonly resolver = new Resolver(this.methods, { cache: true });\n\n async resolve(did: string): Promise<DIDDocument> {\n if (\n !Object.keys(this.methods).some((method) =>\n did.startsWith(`did:${method}:`),\n )\n ) {\n throw new Error(`Unrecognized DID method: ${did}`);\n }\n\n const { didDocument } = await this.resolver.resolve(did);\n if (!didDocument) {\n throw new GraffitiErrorNotFound(`DID not found: ${did}`);\n }\n\n return didDocument;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAsC;AACtC,0BAA2C;AAC3C,8BAA2C;AAC3C,8BAA2C;AAEpC,MAAM,yBAAyB;AAAA,EACjB,UAAU;AAAA,IAC3B,OAAG,wBAAAA,aAAY;AAAA,IACf,OAAG,wBAAAC,aAAY;AAAA,EACjB;AAAA,EAEmB,WAAW,IAAI,6BAAS,KAAK,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA,EAExE,MAAM,QAAQ,KAAmC;AAC/C,QACE,CAAC,OAAO,KAAK,KAAK,OAAO,EAAE;AAAA,MAAK,CAAC,WAC/B,IAAI,WAAW,OAAO,MAAM,GAAG;AAAA,IACjC,GACA;AACA,YAAM,IAAI,MAAM,4BAA4B,GAAG,EAAE;AAAA,IACnD;AAEA,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,SAAS,QAAQ,GAAG;AACvD,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,iCAAsB,kBAAkB,GAAG,EAAE;AAAA,IACzD;AAEA,WAAO;AAAA,EACT;AACF;",
|
|
6
|
+
"names": ["plcResolver", "webResolver"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var storage_buckets_tests_exports = {};
|
|
20
|
+
__export(storage_buckets_tests_exports, {
|
|
21
|
+
storageBucketTests: () => storageBucketTests
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(storage_buckets_tests_exports);
|
|
24
|
+
var import_vitest = require("vitest");
|
|
25
|
+
var import_storage_buckets = require("./3-storage-buckets");
|
|
26
|
+
var import_utilities = require("./utilities");
|
|
27
|
+
var import_api = require("@graffiti-garden/api");
|
|
28
|
+
function storageBucketTests(storageBucketEndpoint, storageBucketToken) {
|
|
29
|
+
(0, import_vitest.describe)("Storage buckets", async () => {
|
|
30
|
+
const storageBuckets = new import_storage_buckets.StorageBuckets();
|
|
31
|
+
(0, import_vitest.test)("put, get, delete", async () => {
|
|
32
|
+
const key = Math.random().toString(36).substring(2, 15);
|
|
33
|
+
const input = "Hello world";
|
|
34
|
+
const bytes = new TextEncoder().encode(input);
|
|
35
|
+
await (0, import_vitest.expect)(
|
|
36
|
+
storageBuckets.get(storageBucketEndpoint, key)
|
|
37
|
+
).rejects.toThrow(import_api.GraffitiErrorNotFound);
|
|
38
|
+
await storageBuckets.put(
|
|
39
|
+
storageBucketEndpoint,
|
|
40
|
+
key,
|
|
41
|
+
bytes,
|
|
42
|
+
storageBucketToken
|
|
43
|
+
);
|
|
44
|
+
const resultBytes = await storageBuckets.get(
|
|
45
|
+
storageBucketEndpoint,
|
|
46
|
+
key,
|
|
47
|
+
bytes.length
|
|
48
|
+
);
|
|
49
|
+
const result = new TextDecoder().decode(resultBytes);
|
|
50
|
+
(0, import_vitest.expect)(result).toEqual(input);
|
|
51
|
+
await storageBuckets.delete(
|
|
52
|
+
storageBucketEndpoint,
|
|
53
|
+
key,
|
|
54
|
+
storageBucketToken
|
|
55
|
+
);
|
|
56
|
+
await (0, import_vitest.expect)(
|
|
57
|
+
storageBuckets.get(storageBucketEndpoint, key)
|
|
58
|
+
).rejects.toThrow(import_api.GraffitiErrorNotFound);
|
|
59
|
+
});
|
|
60
|
+
(0, import_vitest.test)("get with limit less than object", async () => {
|
|
61
|
+
const key = Math.random().toString(36).substring(2, 15);
|
|
62
|
+
const input = "Hello world";
|
|
63
|
+
const bytes = new TextEncoder().encode(input);
|
|
64
|
+
await storageBuckets.put(
|
|
65
|
+
storageBucketEndpoint,
|
|
66
|
+
key,
|
|
67
|
+
bytes,
|
|
68
|
+
storageBucketToken
|
|
69
|
+
);
|
|
70
|
+
await (0, import_vitest.expect)(
|
|
71
|
+
storageBuckets.get(storageBucketEndpoint, key, bytes.length - 1)
|
|
72
|
+
).rejects.toThrow();
|
|
73
|
+
});
|
|
74
|
+
(0, import_vitest.test)("unauthorized", async () => {
|
|
75
|
+
const key = Math.random().toString(36).substring(2, 15);
|
|
76
|
+
const input = "Hello world";
|
|
77
|
+
const bytes = new TextEncoder().encode(input);
|
|
78
|
+
await (0, import_vitest.expect)(
|
|
79
|
+
storageBuckets.put(storageBucketEndpoint, key, bytes, "invalid-token")
|
|
80
|
+
).rejects.toThrow(import_utilities.GraffitiErrorUnauthorized);
|
|
81
|
+
await (0, import_vitest.expect)(
|
|
82
|
+
storageBuckets.delete(storageBucketEndpoint, key, "invalid-token")
|
|
83
|
+
).rejects.toThrow(import_utilities.GraffitiErrorUnauthorized);
|
|
84
|
+
await (0, import_vitest.expect)(
|
|
85
|
+
storageBuckets.export(storageBucketEndpoint, "invalid-token").next()
|
|
86
|
+
).rejects.toThrow(import_utilities.GraffitiErrorUnauthorized);
|
|
87
|
+
});
|
|
88
|
+
(0, import_vitest.test)("export", async () => {
|
|
89
|
+
const keys = /* @__PURE__ */ new Set();
|
|
90
|
+
for (let i = 0; i < 256; i++) {
|
|
91
|
+
const key = Math.random().toString(36).substring(2, 15);
|
|
92
|
+
keys.add(key);
|
|
93
|
+
const input = "Hello world " + i;
|
|
94
|
+
const bytes = new TextEncoder().encode(input);
|
|
95
|
+
await storageBuckets.put(
|
|
96
|
+
storageBucketEndpoint,
|
|
97
|
+
key,
|
|
98
|
+
bytes,
|
|
99
|
+
storageBucketToken
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
const retrievedKeys = /* @__PURE__ */ new Set();
|
|
103
|
+
const iterator = storageBuckets.export(
|
|
104
|
+
storageBucketEndpoint,
|
|
105
|
+
storageBucketToken
|
|
106
|
+
);
|
|
107
|
+
for await (const result of iterator) {
|
|
108
|
+
if (keys.has(result.key)) {
|
|
109
|
+
retrievedKeys.add(result.key);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
(0, import_vitest.expect)(retrievedKeys.size).toEqual(keys.size);
|
|
113
|
+
for (const key of keys) {
|
|
114
|
+
await storageBuckets.delete(
|
|
115
|
+
storageBucketEndpoint,
|
|
116
|
+
key,
|
|
117
|
+
storageBucketToken
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}, 1e6);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=3-storage-buckets-tests.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/1-services/3-storage-buckets-tests.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, test } from \"vitest\";\nimport { StorageBuckets } from \"./3-storage-buckets\";\nimport { GraffitiErrorUnauthorized } from \"./utilities\";\nimport { GraffitiErrorNotFound } from \"@graffiti-garden/api\";\n\nexport function storageBucketTests(\n storageBucketEndpoint: string,\n storageBucketToken: string,\n) {\n describe(\"Storage buckets\", async () => {\n const storageBuckets = new StorageBuckets();\n\n test(\"put, get, delete\", async () => {\n const key = Math.random().toString(36).substring(2, 15);\n const input = \"Hello world\";\n const bytes = new TextEncoder().encode(input);\n\n await expect(\n storageBuckets.get(storageBucketEndpoint, key),\n ).rejects.toThrow(GraffitiErrorNotFound);\n\n await storageBuckets.put(\n storageBucketEndpoint,\n key,\n bytes,\n storageBucketToken,\n );\n\n const resultBytes = await storageBuckets.get(\n storageBucketEndpoint,\n key,\n bytes.length,\n );\n const result = new TextDecoder().decode(resultBytes);\n expect(result).toEqual(input);\n\n await storageBuckets.delete(\n storageBucketEndpoint,\n key,\n storageBucketToken,\n );\n\n await expect(\n storageBuckets.get(storageBucketEndpoint, key),\n ).rejects.toThrow(GraffitiErrorNotFound);\n });\n\n test(\"get with limit less than object\", async () => {\n const key = Math.random().toString(36).substring(2, 15);\n const input = \"Hello world\";\n const bytes = new TextEncoder().encode(input);\n\n await storageBuckets.put(\n storageBucketEndpoint,\n key,\n bytes,\n storageBucketToken,\n );\n\n await expect(\n storageBuckets.get(storageBucketEndpoint, key, bytes.length - 1),\n ).rejects.toThrow();\n });\n\n test(\"unauthorized\", async () => {\n const key = Math.random().toString(36).substring(2, 15);\n const input = \"Hello world\";\n const bytes = new TextEncoder().encode(input);\n\n await expect(\n storageBuckets.put(storageBucketEndpoint, key, bytes, \"invalid-token\"),\n ).rejects.toThrow(GraffitiErrorUnauthorized);\n await expect(\n storageBuckets.delete(storageBucketEndpoint, key, \"invalid-token\"),\n ).rejects.toThrow(GraffitiErrorUnauthorized);\n await expect(\n storageBuckets.export(storageBucketEndpoint, \"invalid-token\").next(),\n ).rejects.toThrow(GraffitiErrorUnauthorized);\n });\n\n test(\"export\", async () => {\n // Put a whole bunch of stuff so the export needs to page\n const keys = new Set<string>();\n for (let i = 0; i < 256; i++) {\n const key = Math.random().toString(36).substring(2, 15);\n keys.add(key);\n\n const input = \"Hello world \" + i;\n const bytes = new TextEncoder().encode(input);\n await storageBuckets.put(\n storageBucketEndpoint,\n key,\n bytes,\n storageBucketToken,\n );\n }\n\n // Export\n const retrievedKeys = new Set<string>();\n const iterator = storageBuckets.export(\n storageBucketEndpoint,\n storageBucketToken,\n );\n for await (const result of iterator) {\n if (keys.has(result.key)) {\n retrievedKeys.add(result.key);\n }\n }\n expect(retrievedKeys.size).toEqual(keys.size);\n\n // Delete all the keys\n for (const key of keys) {\n await storageBuckets.delete(\n storageBucketEndpoint,\n key,\n storageBucketToken,\n );\n }\n }, 1000000);\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var storage_buckets_exports = {};
|
|
20
|
+
__export(storage_buckets_exports, {
|
|
21
|
+
StorageBuckets: () => StorageBuckets
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(storage_buckets_exports);
|
|
24
|
+
var import_utilities = require("./utilities");
|
|
25
|
+
var import_mini = require("zod/mini");
|
|
26
|
+
var import_dag_cbor = require("@ipld/dag-cbor");
|
|
27
|
+
class StorageBuckets {
|
|
28
|
+
getAuthorizationEndpoint = import_utilities.getAuthorizationEndpoint;
|
|
29
|
+
async put(storageBucketEndpoint, key, value, authorizationToken) {
|
|
30
|
+
(0, import_utilities.verifyHTTPSEndpoint)(storageBucketEndpoint);
|
|
31
|
+
const url = `${storageBucketEndpoint}/value/${encodeURIComponent(key)}`;
|
|
32
|
+
await (0, import_utilities.fetchWithErrorHandling)(url, {
|
|
33
|
+
method: "PUT",
|
|
34
|
+
headers: {
|
|
35
|
+
"Content-Type": "application/octet-stream",
|
|
36
|
+
Authorization: `Bearer ${authorizationToken}`
|
|
37
|
+
},
|
|
38
|
+
body: value.slice()
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async delete(storageBucketEndpoint, key, authorizationToken) {
|
|
42
|
+
(0, import_utilities.verifyHTTPSEndpoint)(storageBucketEndpoint);
|
|
43
|
+
const url = `${storageBucketEndpoint}/value/${encodeURIComponent(key)}`;
|
|
44
|
+
await (0, import_utilities.fetchWithErrorHandling)(url, {
|
|
45
|
+
method: "DELETE",
|
|
46
|
+
headers: {
|
|
47
|
+
Authorization: `Bearer ${authorizationToken}`
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async get(storageBucketEndpoint, key, maxBytes) {
|
|
52
|
+
(0, import_utilities.verifyHTTPSEndpoint)(storageBucketEndpoint);
|
|
53
|
+
const url = `${storageBucketEndpoint}/value/${encodeURIComponent(key)}`;
|
|
54
|
+
const response = await (0, import_utilities.fetchWithErrorHandling)(url);
|
|
55
|
+
const reader = response.body?.getReader();
|
|
56
|
+
if (!reader) {
|
|
57
|
+
throw new Error("Failed to read value from storage bucket");
|
|
58
|
+
}
|
|
59
|
+
const contentLengthHeader = response.headers.get("Content-Length");
|
|
60
|
+
const parsedContentLength = contentLengthHeader ? Number(contentLengthHeader) : void 0;
|
|
61
|
+
const hasValidContentLength = !!parsedContentLength && !!Number.isFinite(parsedContentLength) && parsedContentLength >= 0;
|
|
62
|
+
if (hasValidContentLength) {
|
|
63
|
+
const contentLength = parsedContentLength;
|
|
64
|
+
if (maxBytes !== void 0 && contentLength > maxBytes) {
|
|
65
|
+
throw new Error("Value exceeds maximum byte limit");
|
|
66
|
+
}
|
|
67
|
+
const out2 = new Uint8Array(contentLength);
|
|
68
|
+
let offset2 = 0;
|
|
69
|
+
let completed = false;
|
|
70
|
+
try {
|
|
71
|
+
while (offset2 <= out2.length) {
|
|
72
|
+
const { done, value } = await reader.read();
|
|
73
|
+
if (done) {
|
|
74
|
+
completed = true;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
if (!value || value.length === 0) continue;
|
|
78
|
+
const nextOffset = offset2 + value.length;
|
|
79
|
+
if (nextOffset > out2.length) {
|
|
80
|
+
throw new Error("Received more data than expected");
|
|
81
|
+
}
|
|
82
|
+
out2.set(value, offset2);
|
|
83
|
+
offset2 = nextOffset;
|
|
84
|
+
}
|
|
85
|
+
} finally {
|
|
86
|
+
reader.releaseLock();
|
|
87
|
+
}
|
|
88
|
+
if (!completed) {
|
|
89
|
+
throw new Error("Failed to read complete value from storage bucket");
|
|
90
|
+
}
|
|
91
|
+
return offset2 === contentLength ? out2 : out2.slice(0, offset2);
|
|
92
|
+
}
|
|
93
|
+
const chunks = [];
|
|
94
|
+
let total = 0;
|
|
95
|
+
try {
|
|
96
|
+
while (true) {
|
|
97
|
+
const { done, value } = await reader.read();
|
|
98
|
+
if (done) break;
|
|
99
|
+
if (!value || value.length === 0) continue;
|
|
100
|
+
total += value.length;
|
|
101
|
+
if (maxBytes !== void 0 && total > maxBytes) {
|
|
102
|
+
throw new Error("Value exceeds maximum byte limit");
|
|
103
|
+
}
|
|
104
|
+
chunks.push(value.slice());
|
|
105
|
+
}
|
|
106
|
+
} finally {
|
|
107
|
+
reader.releaseLock();
|
|
108
|
+
}
|
|
109
|
+
const out = new Uint8Array(total);
|
|
110
|
+
let offset = 0;
|
|
111
|
+
for (const c of chunks) {
|
|
112
|
+
out.set(c, offset);
|
|
113
|
+
offset += c.length;
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
async *export(storageBucketEndpoint, authorizationToken) {
|
|
118
|
+
(0, import_utilities.verifyHTTPSEndpoint)(storageBucketEndpoint);
|
|
119
|
+
const url = `${storageBucketEndpoint}/export`;
|
|
120
|
+
let cursor = void 0;
|
|
121
|
+
while (true) {
|
|
122
|
+
const response = await (0, import_utilities.fetchWithErrorHandling)(
|
|
123
|
+
cursor ? `${url}?cursor=${encodeURIComponent(cursor)}` : url,
|
|
124
|
+
{
|
|
125
|
+
headers: {
|
|
126
|
+
Authorization: `Bearer ${authorizationToken}`
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
);
|
|
130
|
+
const blob = await response.blob();
|
|
131
|
+
const cbor = (0, import_dag_cbor.decode)(await blob.arrayBuffer());
|
|
132
|
+
const data = ExportSchema.parse(cbor);
|
|
133
|
+
for (const key of data.keys) {
|
|
134
|
+
yield { key };
|
|
135
|
+
}
|
|
136
|
+
if (data.cursor) {
|
|
137
|
+
cursor = data.cursor;
|
|
138
|
+
} else {
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const ExportSchema = (0, import_mini.object)({
|
|
145
|
+
keys: (0, import_mini.array)((0, import_mini.string)()),
|
|
146
|
+
cursor: (0, import_mini.optional)((0, import_mini.nullable)((0, import_mini.string)()))
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=3-storage-buckets.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/1-services/3-storage-buckets.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n fetchWithErrorHandling,\n getAuthorizationEndpoint,\n verifyHTTPSEndpoint,\n} from \"./utilities\";\nimport { string, array, object, optional, nullable } from \"zod/mini\";\nimport { decode as dagCborDecode } from \"@ipld/dag-cbor\";\n\nexport class StorageBuckets {\n getAuthorizationEndpoint = getAuthorizationEndpoint;\n\n async put(\n storageBucketEndpoint: string,\n key: string,\n value: Uint8Array,\n authorizationToken: string,\n ): Promise<void> {\n verifyHTTPSEndpoint(storageBucketEndpoint);\n const url = `${storageBucketEndpoint}/value/${encodeURIComponent(key)}`;\n\n await fetchWithErrorHandling(url, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n Authorization: `Bearer ${authorizationToken}`,\n },\n body: value.slice(),\n });\n }\n\n async delete(\n storageBucketEndpoint: string,\n key: string,\n authorizationToken: string,\n ): Promise<void> {\n verifyHTTPSEndpoint(storageBucketEndpoint);\n const url = `${storageBucketEndpoint}/value/${encodeURIComponent(key)}`;\n\n await fetchWithErrorHandling(url, {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${authorizationToken}`,\n },\n });\n }\n\n async get(\n storageBucketEndpoint: string,\n key: string,\n maxBytes?: number,\n ): Promise<Uint8Array> {\n verifyHTTPSEndpoint(storageBucketEndpoint);\n const url = `${storageBucketEndpoint}/value/${encodeURIComponent(key)}`;\n\n const response = await fetchWithErrorHandling(url);\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"Failed to read value from storage bucket\");\n }\n\n const contentLengthHeader = response.headers.get(\"Content-Length\");\n const parsedContentLength = contentLengthHeader\n ? Number(contentLengthHeader)\n : undefined;\n\n const hasValidContentLength =\n !!parsedContentLength &&\n !!Number.isFinite(parsedContentLength) &&\n parsedContentLength >= 0;\n\n // Fast path: Content-Length exists and is valid\n if (hasValidContentLength) {\n const contentLength = parsedContentLength!;\n if (maxBytes !== undefined && contentLength > maxBytes) {\n throw new Error(\"Value exceeds maximum byte limit\");\n }\n\n const out = new Uint8Array(contentLength);\n let offset = 0;\n let completed = false;\n\n try {\n while (offset <= out.length) {\n const { done, value } = await reader.read();\n\n if (done) {\n completed = true;\n break;\n }\n if (!value || value.length === 0) continue;\n\n const nextOffset = offset + value.length;\n if (nextOffset > out.length) {\n throw new Error(\"Received more data than expected\");\n }\n\n out.set(value, offset);\n offset = nextOffset;\n }\n } finally {\n reader.releaseLock();\n }\n\n if (!completed) {\n throw new Error(\"Failed to read complete value from storage bucket\");\n }\n\n return offset === contentLength ? out : out.slice(0, offset);\n }\n\n // Fallback path: no (usable) Content-Length\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n if (!value || value.length === 0) continue;\n\n total += value.length;\n if (maxBytes !== undefined && total > maxBytes) {\n throw new Error(\"Value exceeds maximum byte limit\");\n }\n\n // Copy because some implementations reuse the underlying buffer\n chunks.push(value.slice());\n }\n } finally {\n reader.releaseLock();\n }\n\n // Concatenate chunks into one Uint8Array\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.length;\n }\n return out;\n }\n\n async *export(\n storageBucketEndpoint: string,\n authorizationToken: string,\n ): AsyncGenerator<{ key: string }> {\n verifyHTTPSEndpoint(storageBucketEndpoint);\n const url = `${storageBucketEndpoint}/export`;\n\n let cursor: string | undefined = undefined;\n while (true) {\n const response = await fetchWithErrorHandling(\n cursor ? `${url}?cursor=${encodeURIComponent(cursor)}` : url,\n {\n headers: {\n Authorization: `Bearer ${authorizationToken}`,\n },\n },\n );\n\n const blob = await response.blob();\n const cbor = dagCborDecode(await blob.arrayBuffer());\n const data = ExportSchema.parse(cbor);\n\n for (const key of data.keys) {\n yield { key };\n }\n\n if (data.cursor) {\n cursor = data.cursor;\n } else {\n break;\n }\n }\n }\n}\n\nconst ExportSchema = object({\n keys: array(string()),\n cursor: optional(nullable(string())),\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["out", "offset", "dagCborDecode"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var inboxes_tests_exports = {};
|
|
20
|
+
__export(inboxes_tests_exports, {
|
|
21
|
+
inboxTests: () => inboxTests
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(inboxes_tests_exports);
|
|
24
|
+
var import_vitest = require("vitest");
|
|
25
|
+
var import_inboxes = require("./4-inboxes");
|
|
26
|
+
var import_utilities = require("./utilities");
|
|
27
|
+
var import_utils = require("@noble/hashes/utils.js");
|
|
28
|
+
function inboxTests(inboxEndpoint, inboxToken) {
|
|
29
|
+
(0, import_vitest.describe)("Inboxes", async () => {
|
|
30
|
+
const inboxes = new import_inboxes.Inboxes();
|
|
31
|
+
(0, import_vitest.test)("send, get", async () => {
|
|
32
|
+
const tags = [(0, import_utils.randomBytes)(), (0, import_utils.randomBytes)()];
|
|
33
|
+
const metadata = (0, import_utils.randomBytes)();
|
|
34
|
+
const object = {
|
|
35
|
+
url: "url:example",
|
|
36
|
+
actor: "did:example",
|
|
37
|
+
channels: ["example", "something"],
|
|
38
|
+
value: {
|
|
39
|
+
nested: {
|
|
40
|
+
property: [1, "askdfj", null]
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
allowed: ["did:example2"]
|
|
44
|
+
};
|
|
45
|
+
const sending = {
|
|
46
|
+
m: metadata,
|
|
47
|
+
o: object,
|
|
48
|
+
t: tags
|
|
49
|
+
};
|
|
50
|
+
const messageId = await inboxes.send(inboxEndpoint, sending);
|
|
51
|
+
const message = await inboxes.get(inboxEndpoint, messageId, inboxToken);
|
|
52
|
+
(0, import_vitest.expect)(message.m).toEqual(sending);
|
|
53
|
+
(0, import_vitest.expect)(message.l).toEqual(0);
|
|
54
|
+
const iterator = inboxes.query(inboxEndpoint, tags, {}, inboxToken);
|
|
55
|
+
const result = await iterator.next();
|
|
56
|
+
(0, import_vitest.assert)(!result.done);
|
|
57
|
+
(0, import_vitest.expect)(result.value.l).toEqual(0);
|
|
58
|
+
(0, import_vitest.expect)(result.value.m.t).toEqual(tags);
|
|
59
|
+
(0, import_vitest.expect)(result.value.m.o).toEqual(object);
|
|
60
|
+
(0, import_vitest.expect)(result.value.id).toEqual(messageId);
|
|
61
|
+
const endResult = await iterator.next();
|
|
62
|
+
(0, import_vitest.expect)(endResult.done).toBe(true);
|
|
63
|
+
await inboxes.label(inboxEndpoint, messageId, 42, inboxToken);
|
|
64
|
+
const iterator2 = inboxes.query(inboxEndpoint, tags, {}, inboxToken);
|
|
65
|
+
const result2 = await iterator2.next();
|
|
66
|
+
(0, import_vitest.assert)(!result2.done);
|
|
67
|
+
(0, import_vitest.expect)(result2.value.l).toEqual(42);
|
|
68
|
+
const endResult2 = await iterator2.next();
|
|
69
|
+
(0, import_vitest.expect)(endResult2.done).toBe(true);
|
|
70
|
+
const message2 = await inboxes.get(inboxEndpoint, messageId, inboxToken);
|
|
71
|
+
(0, import_vitest.expect)(message2.m).toEqual(sending);
|
|
72
|
+
(0, import_vitest.expect)(message2.l).toEqual(42);
|
|
73
|
+
});
|
|
74
|
+
(0, import_vitest.test)("query with continue", async () => {
|
|
75
|
+
const tags = [(0, import_utils.randomBytes)(), (0, import_utils.randomBytes)()];
|
|
76
|
+
const nullResult = await inboxes.query(inboxEndpoint, tags, {}, inboxToken).next();
|
|
77
|
+
(0, import_vitest.assert)(nullResult.done);
|
|
78
|
+
const cursor = nullResult.value;
|
|
79
|
+
const metadata = (0, import_utils.randomBytes)();
|
|
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: [(0, import_utils.randomBytes)(), tags[0]],
|
|
93
|
+
m: metadata
|
|
94
|
+
});
|
|
95
|
+
const result = await inboxes.continueQuery(inboxEndpoint, cursor, inboxToken).next();
|
|
96
|
+
(0, import_vitest.assert)(!result.done);
|
|
97
|
+
(0, import_vitest.expect)(result.value.id).toEqual(messageId);
|
|
98
|
+
});
|
|
99
|
+
(0, import_vitest.test)("unauthorized access", async () => {
|
|
100
|
+
const tags = [(0, import_utils.randomBytes)()];
|
|
101
|
+
await (0, import_vitest.expect)(
|
|
102
|
+
inboxes.query(inboxEndpoint, tags, {}, "invalid-token").next()
|
|
103
|
+
).rejects.toThrowError(import_utilities.GraffitiErrorUnauthorized);
|
|
104
|
+
await (0, import_vitest.expect)(
|
|
105
|
+
inboxes.label(inboxEndpoint, "1", 1, "invalid-token")
|
|
106
|
+
).rejects.toThrowError(import_utilities.GraffitiErrorUnauthorized);
|
|
107
|
+
await (0, import_vitest.expect)(
|
|
108
|
+
inboxes.export(inboxEndpoint, "invalid-token").next()
|
|
109
|
+
).rejects.toThrowError(import_utilities.GraffitiErrorUnauthorized);
|
|
110
|
+
}, 3e4);
|
|
111
|
+
(0, import_vitest.test)("query paged", async () => {
|
|
112
|
+
const tags = [(0, import_utils.randomBytes)(), (0, import_utils.randomBytes)()];
|
|
113
|
+
const numSends = 211;
|
|
114
|
+
for (let i = 0; i < numSends; i++) {
|
|
115
|
+
await inboxes.send(inboxEndpoint, {
|
|
116
|
+
t: tags,
|
|
117
|
+
m: (0, import_utils.randomBytes)(),
|
|
118
|
+
o: {
|
|
119
|
+
url: "url:example",
|
|
120
|
+
actor: "did:example",
|
|
121
|
+
channels: ["example", "something"],
|
|
122
|
+
value: {
|
|
123
|
+
nested: {
|
|
124
|
+
property: [1, "askdfj", null]
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
allowed: ["did:example2"]
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const iterator = inboxes.query(
|
|
132
|
+
inboxEndpoint,
|
|
133
|
+
[(0, import_utils.randomBytes)(), tags[1], (0, import_utils.randomBytes)()],
|
|
134
|
+
{},
|
|
135
|
+
inboxToken
|
|
136
|
+
);
|
|
137
|
+
let count = 0;
|
|
138
|
+
for await (const _ of iterator) {
|
|
139
|
+
count++;
|
|
140
|
+
}
|
|
141
|
+
(0, import_vitest.expect)(count).toBe(numSends);
|
|
142
|
+
}, 1e5);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=4-inboxes-tests.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/1-services/4-inboxes-tests.ts"],
|
|
4
|
+
"sourcesContent": ["import { assert, describe, expect, test } from \"vitest\";\nimport { Inboxes, LABELED_MESSAGE_LABEL_KEY } from \"./4-inboxes\";\nimport { GraffitiErrorUnauthorized } from \"./utilities\";\nimport { randomBytes } from \"@noble/hashes/utils.js\";\nimport type { GraffitiObjectBase } from \"@graffiti-garden/api\";\n\nexport function inboxTests(inboxEndpoint: string, inboxToken: string) {\n describe(\"Inboxes\", async () => {\n const inboxes = new Inboxes();\n\n test(\"send, get\", async () => {\n const tags = [randomBytes(), randomBytes()];\n const metadata = randomBytes();\n const object: GraffitiObjectBase = {\n url: \"url:example\",\n actor: \"did:example\",\n channels: [\"example\", \"something\"],\n value: {\n nested: {\n property: [1, \"askdfj\", null],\n },\n },\n allowed: [\"did:example2\"],\n };\n\n const sending = {\n m: metadata,\n o: object,\n t: tags,\n };\n const messageId = await inboxes.send(inboxEndpoint, sending);\n\n // Get the message back\n const message = await inboxes.get(inboxEndpoint, messageId, inboxToken);\n expect(message.m).toEqual(sending);\n expect(message.l).toEqual(0);\n\n const iterator = inboxes.query<{}>(inboxEndpoint, tags, {}, inboxToken);\n\n const result = await iterator.next();\n assert(!result.done);\n\n // No label yet so it must be zero\n expect(result.value.l).toEqual(0);\n\n expect(result.value.m.t).toEqual(tags);\n expect(result.value.m.o).toEqual(object);\n expect(result.value.id).toEqual(messageId);\n\n const endResult = await iterator.next();\n expect(endResult.done).toBe(true);\n\n // Label the message\n await inboxes.label(inboxEndpoint, messageId, 42, inboxToken);\n\n const iterator2 = inboxes.query<{}>(inboxEndpoint, tags, {}, inboxToken);\n\n const result2 = await iterator2.next();\n assert(!result2.done);\n expect(result2.value.l).toEqual(42);\n const endResult2 = await iterator2.next();\n expect(endResult2.done).toBe(true);\n\n const message2 = await inboxes.get(inboxEndpoint, messageId, inboxToken);\n expect(message2.m).toEqual(sending);\n expect(message2.l).toEqual(42);\n });\n\n test(\"query with continue\", async () => {\n const tags = [randomBytes(), randomBytes()];\n\n const nullResult = await inboxes\n .query<{}>(inboxEndpoint, tags, {}, inboxToken)\n .next();\n assert(nullResult.done);\n const cursor = nullResult.value;\n\n const metadata = randomBytes();\n\n const messageId = await inboxes.send(inboxEndpoint, {\n o: {\n url: \"url:example\",\n actor: \"did:example\",\n channels: [\"example\", \"something\"],\n value: {\n nested: {\n property: [1, \"askdfj\", null],\n },\n },\n allowed: [\"did:example2\"],\n },\n t: [randomBytes(), tags[0]],\n m: metadata,\n });\n\n const result = await inboxes\n .continueQuery(inboxEndpoint, cursor, inboxToken)\n .next();\n assert(!result.done);\n expect(result.value.id).toEqual(messageId);\n });\n\n test(\"unauthorized access\", async () => {\n const tags = [randomBytes()];\n\n await expect(\n inboxes.query(inboxEndpoint, tags, {}, \"invalid-token\").next(),\n ).rejects.toThrowError(GraffitiErrorUnauthorized);\n await expect(\n inboxes.label(inboxEndpoint, \"1\", 1, \"invalid-token\"),\n ).rejects.toThrowError(GraffitiErrorUnauthorized);\n await expect(\n inboxes.export(inboxEndpoint, \"invalid-token\").next(),\n ).rejects.toThrowError(GraffitiErrorUnauthorized);\n }, 30000);\n\n test(\"query paged\", async () => {\n const tags = [randomBytes(), randomBytes()];\n\n const numSends = 211;\n for (let i = 0; i < numSends; i++) {\n await inboxes.send(inboxEndpoint, {\n t: tags,\n m: randomBytes(),\n o: {\n url: \"url:example\",\n actor: \"did:example\",\n channels: [\"example\", \"something\"],\n value: {\n nested: {\n property: [1, \"askdfj\", null],\n },\n },\n allowed: [\"did:example2\"],\n },\n });\n }\n\n const iterator = inboxes.query(\n inboxEndpoint,\n [randomBytes(), tags[1], randomBytes()],\n {},\n inboxToken,\n );\n\n let count = 0;\n for await (const _ of iterator) {\n count++;\n }\n\n expect(count).toBe(numSends);\n }, 100000);\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|