@kaiz11/stack-client 0.0.14
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 +32 -0
- package/README.md +586 -0
- package/dist/accounts/accounts-client.d.ts +188 -0
- package/dist/accounts/accounts-client.d.ts.map +1 -0
- package/dist/accounts/accounts-client.js +264 -0
- package/dist/accounts/accounts-client.js.map +1 -0
- package/dist/accounts/index.d.ts +8 -0
- package/dist/accounts/index.d.ts.map +1 -0
- package/dist/accounts/index.js +8 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/accounts/mock-accounts.d.ts +90 -0
- package/dist/accounts/mock-accounts.d.ts.map +1 -0
- package/dist/accounts/mock-accounts.js +434 -0
- package/dist/accounts/mock-accounts.js.map +1 -0
- package/dist/accounts/types.d.ts +180 -0
- package/dist/accounts/types.d.ts.map +1 -0
- package/dist/accounts/types.js +59 -0
- package/dist/accounts/types.js.map +1 -0
- package/dist/auth/auth-client.d.ts +224 -0
- package/dist/auth/auth-client.d.ts.map +1 -0
- package/dist/auth/auth-client.js +230 -0
- package/dist/auth/auth-client.js.map +1 -0
- package/dist/auth/base-auth.d.ts +44 -0
- package/dist/auth/base-auth.d.ts.map +1 -0
- package/dist/auth/base-auth.js +55 -0
- package/dist/auth/base-auth.js.map +1 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/methods/admin.d.ts +59 -0
- package/dist/auth/methods/admin.d.ts.map +1 -0
- package/dist/auth/methods/admin.js +55 -0
- package/dist/auth/methods/admin.js.map +1 -0
- package/dist/auth/methods/index.d.ts +9 -0
- package/dist/auth/methods/index.d.ts.map +1 -0
- package/dist/auth/methods/index.js +8 -0
- package/dist/auth/methods/index.js.map +1 -0
- package/dist/auth/methods/magic-link.d.ts +27 -0
- package/dist/auth/methods/magic-link.d.ts.map +1 -0
- package/dist/auth/methods/magic-link.js +37 -0
- package/dist/auth/methods/magic-link.js.map +1 -0
- package/dist/auth/methods/mfa.d.ts +92 -0
- package/dist/auth/methods/mfa.d.ts.map +1 -0
- package/dist/auth/methods/mfa.js +153 -0
- package/dist/auth/methods/mfa.js.map +1 -0
- package/dist/auth/methods/oauth.d.ts +62 -0
- package/dist/auth/methods/oauth.d.ts.map +1 -0
- package/dist/auth/methods/oauth.js +165 -0
- package/dist/auth/methods/oauth.js.map +1 -0
- package/dist/auth/methods/otp.d.ts +43 -0
- package/dist/auth/methods/otp.d.ts.map +1 -0
- package/dist/auth/methods/otp.js +66 -0
- package/dist/auth/methods/otp.js.map +1 -0
- package/dist/auth/methods/password.d.ts +64 -0
- package/dist/auth/methods/password.d.ts.map +1 -0
- package/dist/auth/methods/password.js +116 -0
- package/dist/auth/methods/password.js.map +1 -0
- package/dist/auth/methods/recovery.d.ts +62 -0
- package/dist/auth/methods/recovery.d.ts.map +1 -0
- package/dist/auth/methods/recovery.js +100 -0
- package/dist/auth/methods/recovery.js.map +1 -0
- package/dist/auth/mock-auth.d.ts +135 -0
- package/dist/auth/mock-auth.d.ts.map +1 -0
- package/dist/auth/mock-auth.js +417 -0
- package/dist/auth/mock-auth.js.map +1 -0
- package/dist/auth/server/helpers.d.ts +215 -0
- package/dist/auth/server/helpers.d.ts.map +1 -0
- package/dist/auth/server/helpers.js +241 -0
- package/dist/auth/server/helpers.js.map +1 -0
- package/dist/auth/server/index.d.ts +24 -0
- package/dist/auth/server/index.d.ts.map +1 -0
- package/dist/auth/server/index.js +40 -0
- package/dist/auth/server/index.js.map +1 -0
- package/dist/auth/server/middleware.d.ts +305 -0
- package/dist/auth/server/middleware.d.ts.map +1 -0
- package/dist/auth/server/middleware.js +405 -0
- package/dist/auth/server/middleware.js.map +1 -0
- package/dist/auth/server/verify.d.ts +184 -0
- package/dist/auth/server/verify.d.ts.map +1 -0
- package/dist/auth/server/verify.js +222 -0
- package/dist/auth/server/verify.js.map +1 -0
- package/dist/auth/token-manager.d.ts +94 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +231 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/auth/types.d.ts +412 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +66 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/user/identities.d.ts +62 -0
- package/dist/auth/user/identities.d.ts.map +1 -0
- package/dist/auth/user/identities.js +88 -0
- package/dist/auth/user/identities.js.map +1 -0
- package/dist/auth/user/index.d.ts +4 -0
- package/dist/auth/user/index.d.ts.map +1 -0
- package/dist/auth/user/index.js +4 -0
- package/dist/auth/user/index.js.map +1 -0
- package/dist/auth/user/user.d.ts +64 -0
- package/dist/auth/user/user.d.ts.map +1 -0
- package/dist/auth/user/user.js +105 -0
- package/dist/auth/user/user.js.map +1 -0
- package/dist/auth/user/verification.d.ts +49 -0
- package/dist/auth/user/verification.d.ts.map +1 -0
- package/dist/auth/user/verification.js +71 -0
- package/dist/auth/user/verification.js.map +1 -0
- package/dist/cli/browser.d.ts +11 -0
- package/dist/cli/browser.d.ts.map +1 -0
- package/dist/cli/browser.js +35 -0
- package/dist/cli/browser.js.map +1 -0
- package/dist/cli/callback-server.d.ts +30 -0
- package/dist/cli/callback-server.d.ts.map +1 -0
- package/dist/cli/callback-server.js +100 -0
- package/dist/cli/callback-server.js.map +1 -0
- package/dist/cli/file-token-store.d.ts +79 -0
- package/dist/cli/file-token-store.d.ts.map +1 -0
- package/dist/cli/file-token-store.js +138 -0
- package/dist/cli/file-token-store.js.map +1 -0
- package/dist/cli/index.d.ts +33 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/oauth.d.ts +67 -0
- package/dist/cli/oauth.d.ts.map +1 -0
- package/dist/cli/oauth.js +101 -0
- package/dist/cli/oauth.js.map +1 -0
- package/dist/cli/pkce.d.ts +35 -0
- package/dist/cli/pkce.d.ts.map +1 -0
- package/dist/cli/pkce.js +43 -0
- package/dist/cli/pkce.js.map +1 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +99 -0
- package/dist/client.js.map +1 -0
- package/dist/db/client.d.ts +9 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +19 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/errors.d.ts +19 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +57 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +5 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/mock.d.ts +28 -0
- package/dist/db/mock.d.ts.map +1 -0
- package/dist/db/mock.js +459 -0
- package/dist/db/mock.js.map +1 -0
- package/dist/db/types.d.ts +73 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/errors.d.ts +33 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +76 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/http.d.ts +81 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +163 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/keys.d.ts +87 -0
- package/dist/lib/keys.d.ts.map +1 -0
- package/dist/lib/keys.js +147 -0
- package/dist/lib/keys.js.map +1 -0
- package/dist/lib/paths.d.ts +37 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +49 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/token-store.d.ts +42 -0
- package/dist/lib/token-store.d.ts.map +1 -0
- package/dist/lib/token-store.js +75 -0
- package/dist/lib/token-store.js.map +1 -0
- package/dist/mocks/handlers.d.ts +29 -0
- package/dist/mocks/handlers.d.ts.map +1 -0
- package/dist/mocks/handlers.js +79 -0
- package/dist/mocks/handlers.js.map +1 -0
- package/dist/mocks/index.d.ts +5 -0
- package/dist/mocks/index.d.ts.map +1 -0
- package/dist/mocks/index.js +9 -0
- package/dist/mocks/index.js.map +1 -0
- package/dist/mocks/responses.d.ts +76 -0
- package/dist/mocks/responses.d.ts.map +1 -0
- package/dist/mocks/responses.js +91 -0
- package/dist/mocks/responses.js.map +1 -0
- package/dist/mocks/server.d.ts +7 -0
- package/dist/mocks/server.d.ts.map +1 -0
- package/dist/mocks/server.js +9 -0
- package/dist/mocks/server.js.map +1 -0
- package/dist/mocks/state.d.ts +86 -0
- package/dist/mocks/state.d.ts.map +1 -0
- package/dist/mocks/state.js +77 -0
- package/dist/mocks/state.js.map +1 -0
- package/dist/storage/bucket-ref.d.ts +183 -0
- package/dist/storage/bucket-ref.d.ts.map +1 -0
- package/dist/storage/bucket-ref.js +529 -0
- package/dist/storage/bucket-ref.js.map +1 -0
- package/dist/storage/errors.d.ts +27 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +89 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +13 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/interface.d.ts +245 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +2 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/mock-storage.d.ts +67 -0
- package/dist/storage/mock-storage.d.ts.map +1 -0
- package/dist/storage/mock-storage.js +478 -0
- package/dist/storage/mock-storage.js.map +1 -0
- package/dist/storage/policies-client.d.ts +77 -0
- package/dist/storage/policies-client.d.ts.map +1 -0
- package/dist/storage/policies-client.js +115 -0
- package/dist/storage/policies-client.js.map +1 -0
- package/dist/storage/policy-templates.d.ts +6 -0
- package/dist/storage/policy-templates.d.ts.map +1 -0
- package/dist/storage/policy-templates.js +290 -0
- package/dist/storage/policy-templates.js.map +1 -0
- package/dist/storage/policy-types.d.ts +98 -0
- package/dist/storage/policy-types.d.ts.map +1 -0
- package/dist/storage/policy-types.js +20 -0
- package/dist/storage/policy-types.js.map +1 -0
- package/dist/storage/storage-client.d.ts +32 -0
- package/dist/storage/storage-client.d.ts.map +1 -0
- package/dist/storage/storage-client.js +94 -0
- package/dist/storage/storage-client.js.map +1 -0
- package/dist/storage/tus-upload.d.ts +56 -0
- package/dist/storage/tus-upload.d.ts.map +1 -0
- package/dist/storage/tus-upload.js +236 -0
- package/dist/storage/tus-upload.js.map +1 -0
- package/dist/storage/types.d.ts +335 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +39 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/test/auth/helpers.d.ts +33 -0
- package/dist/test/auth/helpers.d.ts.map +1 -0
- package/dist/test/auth/helpers.js +80 -0
- package/dist/test/auth/helpers.js.map +1 -0
- package/dist/test/helpers/jwt.d.ts +61 -0
- package/dist/test/helpers/jwt.d.ts.map +1 -0
- package/dist/test/helpers/jwt.js +132 -0
- package/dist/test/helpers/jwt.js.map +1 -0
- package/dist/test/helpers/mailpit.d.ts +61 -0
- package/dist/test/helpers/mailpit.d.ts.map +1 -0
- package/dist/test/helpers/mailpit.js +107 -0
- package/dist/test/helpers/mailpit.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +17 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { normalizePolicy, } from "./policy-types.js";
|
|
2
|
+
import { generatePolicySet } from "./policy-templates.js";
|
|
3
|
+
/**
|
|
4
|
+
* Storage policies client for managing RLS policies on storage.objects
|
|
5
|
+
*/
|
|
6
|
+
export class StoragePoliciesClient {
|
|
7
|
+
http;
|
|
8
|
+
tenantId;
|
|
9
|
+
accountId;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.http = config.http;
|
|
12
|
+
this.tenantId = config.tenantId;
|
|
13
|
+
this.accountId = config.accountId;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build path to postgres-meta policies endpoint
|
|
17
|
+
*/
|
|
18
|
+
path(endpoint = "") {
|
|
19
|
+
return `/pg/${this.accountId}/${this.tenantId}/policies${endpoint}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* List all storage policies, optionally filtered by bucket
|
|
23
|
+
*/
|
|
24
|
+
async list(bucketId) {
|
|
25
|
+
const response = await this.http.rawRequest(`${this.path()}?included_schemas=storage`, { method: "GET" });
|
|
26
|
+
const data = (await response.json());
|
|
27
|
+
// Filter to only storage.objects policies
|
|
28
|
+
let policies = data
|
|
29
|
+
.filter((p) => p.schema === "storage" && p.table === "objects")
|
|
30
|
+
.map(normalizePolicy);
|
|
31
|
+
// Optionally filter by bucket
|
|
32
|
+
if (bucketId) {
|
|
33
|
+
policies = policies.filter((p) => p.definition?.includes(`bucket_id = '${bucketId}'`) ||
|
|
34
|
+
p.check?.includes(`bucket_id = '${bucketId}'`));
|
|
35
|
+
}
|
|
36
|
+
return policies;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create a single policy
|
|
40
|
+
*/
|
|
41
|
+
async create(policy) {
|
|
42
|
+
const body = {
|
|
43
|
+
name: policy.name.toLowerCase().replace(/\s+/g, "_"),
|
|
44
|
+
schema: "storage",
|
|
45
|
+
table: "objects",
|
|
46
|
+
action: "PERMISSIVE",
|
|
47
|
+
command: policy.command,
|
|
48
|
+
roles: policy.roles,
|
|
49
|
+
};
|
|
50
|
+
// INSERT only allows WITH CHECK, not USING (definition)
|
|
51
|
+
if (policy.command === "INSERT") {
|
|
52
|
+
body.check = policy.check ?? policy.definition;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
body.definition = policy.definition;
|
|
56
|
+
if (policy.check) {
|
|
57
|
+
body.check = policy.check;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const response = await this.http.rawRequest(this.path(), {
|
|
61
|
+
method: "POST",
|
|
62
|
+
headers: { "Content-Type": "application/json" },
|
|
63
|
+
body: JSON.stringify(body),
|
|
64
|
+
});
|
|
65
|
+
const data = (await response.json());
|
|
66
|
+
return normalizePolicy(data);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create multiple policies from a policy set (additive)
|
|
70
|
+
*/
|
|
71
|
+
async createSet(bucketId, policies) {
|
|
72
|
+
const created = [];
|
|
73
|
+
if (policies.select) {
|
|
74
|
+
created.push(await this.create(policies.select));
|
|
75
|
+
}
|
|
76
|
+
if (policies.insert) {
|
|
77
|
+
created.push(await this.create(policies.insert));
|
|
78
|
+
}
|
|
79
|
+
if (policies.update) {
|
|
80
|
+
created.push(await this.create(policies.update));
|
|
81
|
+
}
|
|
82
|
+
if (policies.delete) {
|
|
83
|
+
created.push(await this.create(policies.delete));
|
|
84
|
+
}
|
|
85
|
+
return created;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Apply a template (deletes existing bucket policies, creates new ones)
|
|
89
|
+
*/
|
|
90
|
+
async applyTemplate(bucketId, template) {
|
|
91
|
+
// Delete existing policies for this bucket
|
|
92
|
+
await this.deleteAll(bucketId);
|
|
93
|
+
// Generate and create new policies
|
|
94
|
+
const policySet = generatePolicySet(bucketId, template);
|
|
95
|
+
return this.createSet(bucketId, policySet);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Delete a policy by ID
|
|
99
|
+
*/
|
|
100
|
+
async delete(policyId) {
|
|
101
|
+
await this.http.rawRequest(this.path(`/${policyId}`), {
|
|
102
|
+
method: "DELETE",
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Delete all policies for a bucket
|
|
107
|
+
*/
|
|
108
|
+
async deleteAll(bucketId) {
|
|
109
|
+
const policies = await this.list(bucketId);
|
|
110
|
+
for (const policy of policies) {
|
|
111
|
+
await this.delete(policy.id);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=policies-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policies-client.js","sourceRoot":"","sources":["../../src/storage/policies-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { StoragePolicySet } from "./policy-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Generate policy set for a specific template and bucket
|
|
4
|
+
*/
|
|
5
|
+
export declare function generatePolicySet(bucketId: string, template: string): StoragePolicySet;
|
|
6
|
+
//# sourceMappingURL=policy-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-templates.d.ts","sourceRoot":"","sources":["../../src/storage/policy-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAmBlB"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate policy set for a specific template and bucket
|
|
3
|
+
*/
|
|
4
|
+
export function generatePolicySet(bucketId, template) {
|
|
5
|
+
const prefix = bucketId.replace(/[^a-z0-9_]/gi, "_");
|
|
6
|
+
switch (template) {
|
|
7
|
+
case "ownerOnly":
|
|
8
|
+
return ownerOnlyPolicies(bucketId, prefix);
|
|
9
|
+
case "authenticated":
|
|
10
|
+
return authenticatedPolicies(bucketId, prefix);
|
|
11
|
+
case "publicRead":
|
|
12
|
+
return publicReadPolicies(bucketId, prefix);
|
|
13
|
+
case "uploadOnly":
|
|
14
|
+
return uploadOnlyPolicies(bucketId, prefix);
|
|
15
|
+
case "userFolder":
|
|
16
|
+
return userFolderPolicies(bucketId, prefix);
|
|
17
|
+
case "adminOnly":
|
|
18
|
+
return adminOnlyPolicies(bucketId, prefix);
|
|
19
|
+
default:
|
|
20
|
+
throw new Error(`Unknown policy template: ${template}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Template: Owner Only
|
|
25
|
+
*
|
|
26
|
+
* Users can only access files they uploaded (via `owner_id`).
|
|
27
|
+
*
|
|
28
|
+
* Access Matrix:
|
|
29
|
+
* | Role | SELECT | INSERT | UPDATE | DELETE |
|
|
30
|
+
* |---------------|--------|--------|--------|--------|
|
|
31
|
+
* | anon | ❌ | ❌ | ❌ | ❌ |
|
|
32
|
+
* | authenticated | Own | ✅ | Own | Own |
|
|
33
|
+
* | service_role | ✅ | ✅ | ✅ | ✅ |
|
|
34
|
+
*
|
|
35
|
+
* Use case: User profile pictures, personal documents.
|
|
36
|
+
*/
|
|
37
|
+
function ownerOnlyPolicies(bucketId, prefix) {
|
|
38
|
+
const bucketCheck = `bucket_id = '${bucketId}'`;
|
|
39
|
+
const ownerCheck = `owner_id = auth.uid()::text`;
|
|
40
|
+
const serviceBypass = `auth.role() = 'service_role'`;
|
|
41
|
+
return {
|
|
42
|
+
select: {
|
|
43
|
+
name: `${prefix}_owner_select`,
|
|
44
|
+
command: "SELECT",
|
|
45
|
+
roles: ["authenticated", "service_role"],
|
|
46
|
+
definition: `${bucketCheck} AND (${ownerCheck} OR ${serviceBypass})`,
|
|
47
|
+
},
|
|
48
|
+
insert: {
|
|
49
|
+
name: `${prefix}_owner_insert`,
|
|
50
|
+
command: "INSERT",
|
|
51
|
+
roles: ["authenticated", "service_role"],
|
|
52
|
+
definition: bucketCheck,
|
|
53
|
+
check: bucketCheck,
|
|
54
|
+
},
|
|
55
|
+
update: {
|
|
56
|
+
name: `${prefix}_owner_update`,
|
|
57
|
+
command: "UPDATE",
|
|
58
|
+
roles: ["authenticated", "service_role"],
|
|
59
|
+
definition: `${bucketCheck} AND (${ownerCheck} OR ${serviceBypass})`,
|
|
60
|
+
},
|
|
61
|
+
delete: {
|
|
62
|
+
name: `${prefix}_owner_delete`,
|
|
63
|
+
command: "DELETE",
|
|
64
|
+
roles: ["authenticated", "service_role"],
|
|
65
|
+
definition: `${bucketCheck} AND (${ownerCheck} OR ${serviceBypass})`,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Template: Authenticated
|
|
71
|
+
*
|
|
72
|
+
* Any logged-in user can access all files in the bucket.
|
|
73
|
+
*
|
|
74
|
+
* Access Matrix:
|
|
75
|
+
* | Role | SELECT | INSERT | UPDATE | DELETE |
|
|
76
|
+
* |---------------|--------|--------|--------|--------|
|
|
77
|
+
* | anon | ❌ | ❌ | ❌ | ❌ |
|
|
78
|
+
* | authenticated | ✅ | ✅ | ✅ | ✅ |
|
|
79
|
+
* | service_role | ✅ | ✅ | ✅ | ✅ |
|
|
80
|
+
*
|
|
81
|
+
* Use case: Team shared folders, workspace documents.
|
|
82
|
+
*/
|
|
83
|
+
function authenticatedPolicies(bucketId, prefix) {
|
|
84
|
+
const bucketCheck = `bucket_id = '${bucketId}'`;
|
|
85
|
+
const authCheck = `auth.role() IN ('authenticated', 'service_role')`;
|
|
86
|
+
return {
|
|
87
|
+
select: {
|
|
88
|
+
name: `${prefix}_auth_select`,
|
|
89
|
+
command: "SELECT",
|
|
90
|
+
roles: ["authenticated", "service_role"],
|
|
91
|
+
definition: `${bucketCheck} AND ${authCheck}`,
|
|
92
|
+
},
|
|
93
|
+
insert: {
|
|
94
|
+
name: `${prefix}_auth_insert`,
|
|
95
|
+
command: "INSERT",
|
|
96
|
+
roles: ["authenticated", "service_role"],
|
|
97
|
+
definition: bucketCheck,
|
|
98
|
+
check: bucketCheck,
|
|
99
|
+
},
|
|
100
|
+
update: {
|
|
101
|
+
name: `${prefix}_auth_update`,
|
|
102
|
+
command: "UPDATE",
|
|
103
|
+
roles: ["authenticated", "service_role"],
|
|
104
|
+
definition: `${bucketCheck} AND ${authCheck}`,
|
|
105
|
+
},
|
|
106
|
+
delete: {
|
|
107
|
+
name: `${prefix}_auth_delete`,
|
|
108
|
+
command: "DELETE",
|
|
109
|
+
roles: ["authenticated", "service_role"],
|
|
110
|
+
definition: `${bucketCheck} AND ${authCheck}`,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Template: Public Read
|
|
116
|
+
*
|
|
117
|
+
* Anyone can read files, but only authenticated users can write.
|
|
118
|
+
* Only service_role can update/delete.
|
|
119
|
+
*
|
|
120
|
+
* Access Matrix:
|
|
121
|
+
* | Role | SELECT | INSERT | UPDATE | DELETE |
|
|
122
|
+
* |---------------|--------|--------|--------|--------|
|
|
123
|
+
* | anon | ✅ | ❌ | ❌ | ❌ |
|
|
124
|
+
* | authenticated | ✅ | ✅ | ❌ | ❌ |
|
|
125
|
+
* | service_role | ✅ | ✅ | ✅ | ✅ |
|
|
126
|
+
*
|
|
127
|
+
* Use case: CDN assets, blog images, public marketing content.
|
|
128
|
+
*/
|
|
129
|
+
function publicReadPolicies(bucketId, prefix) {
|
|
130
|
+
const bucketCheck = `bucket_id = '${bucketId}'`;
|
|
131
|
+
return {
|
|
132
|
+
select: {
|
|
133
|
+
name: `${prefix}_public_select`,
|
|
134
|
+
command: "SELECT",
|
|
135
|
+
roles: ["anon", "authenticated", "service_role"],
|
|
136
|
+
definition: bucketCheck,
|
|
137
|
+
},
|
|
138
|
+
insert: {
|
|
139
|
+
name: `${prefix}_public_insert`,
|
|
140
|
+
command: "INSERT",
|
|
141
|
+
roles: ["authenticated", "service_role"],
|
|
142
|
+
definition: bucketCheck,
|
|
143
|
+
check: bucketCheck,
|
|
144
|
+
},
|
|
145
|
+
update: {
|
|
146
|
+
name: `${prefix}_public_update`,
|
|
147
|
+
command: "UPDATE",
|
|
148
|
+
roles: ["service_role"],
|
|
149
|
+
definition: bucketCheck,
|
|
150
|
+
},
|
|
151
|
+
delete: {
|
|
152
|
+
name: `${prefix}_public_delete`,
|
|
153
|
+
command: "DELETE",
|
|
154
|
+
roles: ["service_role"],
|
|
155
|
+
definition: bucketCheck,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Template: Upload Only
|
|
161
|
+
*
|
|
162
|
+
* Anyone can upload files, but only service_role can read/delete.
|
|
163
|
+
* Useful for form submissions or anonymous file drops.
|
|
164
|
+
*
|
|
165
|
+
* Access Matrix:
|
|
166
|
+
* | Role | SELECT | INSERT | UPDATE | DELETE |
|
|
167
|
+
* |---------------|--------|--------|--------|--------|
|
|
168
|
+
* | anon | ❌ | ✅ | ❌ | ❌ |
|
|
169
|
+
* | authenticated | ❌ | ✅ | ❌ | ❌ |
|
|
170
|
+
* | service_role | ✅ | ✅ | ❌ | ✅ |
|
|
171
|
+
*
|
|
172
|
+
* Use case: Form submissions, anonymous file inbox.
|
|
173
|
+
*/
|
|
174
|
+
function uploadOnlyPolicies(bucketId, prefix) {
|
|
175
|
+
const bucketCheck = `bucket_id = '${bucketId}'`;
|
|
176
|
+
return {
|
|
177
|
+
select: {
|
|
178
|
+
name: `${prefix}_upload_select`,
|
|
179
|
+
command: "SELECT",
|
|
180
|
+
roles: ["service_role"],
|
|
181
|
+
definition: bucketCheck,
|
|
182
|
+
},
|
|
183
|
+
insert: {
|
|
184
|
+
name: `${prefix}_upload_insert`,
|
|
185
|
+
command: "INSERT",
|
|
186
|
+
roles: ["anon", "authenticated", "service_role"],
|
|
187
|
+
definition: bucketCheck,
|
|
188
|
+
check: bucketCheck,
|
|
189
|
+
},
|
|
190
|
+
delete: {
|
|
191
|
+
name: `${prefix}_upload_delete`,
|
|
192
|
+
command: "DELETE",
|
|
193
|
+
roles: ["service_role"],
|
|
194
|
+
definition: bucketCheck,
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Template: User Folder
|
|
200
|
+
*
|
|
201
|
+
* Path-based isolation where the first folder must be the user's ID.
|
|
202
|
+
* Files at `/{user_id}/...` are accessible only to that user.
|
|
203
|
+
*
|
|
204
|
+
* Access Matrix:
|
|
205
|
+
* | Role | SELECT | INSERT | UPDATE | DELETE |
|
|
206
|
+
* |---------------|----------|----------|----------|----------|
|
|
207
|
+
* | anon | ❌ | ❌ | ❌ | ❌ |
|
|
208
|
+
* | authenticated | Own path | Own path | Own path | Own path |
|
|
209
|
+
* | service_role | ✅ | ✅ | ✅ | ✅ |
|
|
210
|
+
*
|
|
211
|
+
* Use case: Multi-tenant storage isolation, user-specific directories.
|
|
212
|
+
*/
|
|
213
|
+
function userFolderPolicies(bucketId, prefix) {
|
|
214
|
+
const bucketCheck = `bucket_id = '${bucketId}'`;
|
|
215
|
+
const folderCheck = `split_part(name, '/', 1) = auth.uid()::text`;
|
|
216
|
+
const serviceBypass = `auth.role() = 'service_role'`;
|
|
217
|
+
return {
|
|
218
|
+
select: {
|
|
219
|
+
name: `${prefix}_folder_select`,
|
|
220
|
+
command: "SELECT",
|
|
221
|
+
roles: ["authenticated", "service_role"],
|
|
222
|
+
definition: `${bucketCheck} AND (${folderCheck} OR ${serviceBypass})`,
|
|
223
|
+
},
|
|
224
|
+
insert: {
|
|
225
|
+
name: `${prefix}_folder_insert`,
|
|
226
|
+
command: "INSERT",
|
|
227
|
+
roles: ["authenticated", "service_role"],
|
|
228
|
+
definition: `${bucketCheck} AND (${folderCheck} OR ${serviceBypass})`,
|
|
229
|
+
check: `${bucketCheck} AND (${folderCheck} OR ${serviceBypass})`,
|
|
230
|
+
},
|
|
231
|
+
update: {
|
|
232
|
+
name: `${prefix}_folder_update`,
|
|
233
|
+
command: "UPDATE",
|
|
234
|
+
roles: ["authenticated", "service_role"],
|
|
235
|
+
definition: `${bucketCheck} AND (${folderCheck} OR ${serviceBypass})`,
|
|
236
|
+
},
|
|
237
|
+
delete: {
|
|
238
|
+
name: `${prefix}_folder_delete`,
|
|
239
|
+
command: "DELETE",
|
|
240
|
+
roles: ["authenticated", "service_role"],
|
|
241
|
+
definition: `${bucketCheck} AND (${folderCheck} OR ${serviceBypass})`,
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Template: Admin Only
|
|
247
|
+
*
|
|
248
|
+
* Only service_role (backend) can access files.
|
|
249
|
+
* No access for anon or authenticated users.
|
|
250
|
+
*
|
|
251
|
+
* Access Matrix:
|
|
252
|
+
* | Role | SELECT | INSERT | UPDATE | DELETE |
|
|
253
|
+
* |---------------|--------|--------|--------|--------|
|
|
254
|
+
* | anon | ❌ | ❌ | ❌ | ❌ |
|
|
255
|
+
* | authenticated | ❌ | ❌ | ❌ | ❌ |
|
|
256
|
+
* | service_role | ✅ | ✅ | ✅ | ✅ |
|
|
257
|
+
*
|
|
258
|
+
* Use case: System files, internal assets, API-generated content.
|
|
259
|
+
*/
|
|
260
|
+
function adminOnlyPolicies(bucketId, prefix) {
|
|
261
|
+
const bucketCheck = `bucket_id = '${bucketId}'`;
|
|
262
|
+
return {
|
|
263
|
+
select: {
|
|
264
|
+
name: `${prefix}_admin_select`,
|
|
265
|
+
command: "SELECT",
|
|
266
|
+
roles: ["service_role"],
|
|
267
|
+
definition: bucketCheck,
|
|
268
|
+
},
|
|
269
|
+
insert: {
|
|
270
|
+
name: `${prefix}_admin_insert`,
|
|
271
|
+
command: "INSERT",
|
|
272
|
+
roles: ["service_role"],
|
|
273
|
+
definition: bucketCheck,
|
|
274
|
+
check: bucketCheck,
|
|
275
|
+
},
|
|
276
|
+
update: {
|
|
277
|
+
name: `${prefix}_admin_update`,
|
|
278
|
+
command: "UPDATE",
|
|
279
|
+
roles: ["service_role"],
|
|
280
|
+
definition: bucketCheck,
|
|
281
|
+
},
|
|
282
|
+
delete: {
|
|
283
|
+
name: `${prefix}_admin_delete`,
|
|
284
|
+
command: "DELETE",
|
|
285
|
+
roles: ["service_role"],
|
|
286
|
+
definition: bucketCheck,
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=policy-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-templates.js","sourceRoot":"","sources":["../../src/storage/policy-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy command (SQL operations)
|
|
3
|
+
*/
|
|
4
|
+
export type PolicyCommand = "SELECT" | "INSERT" | "UPDATE" | "DELETE" | "ALL";
|
|
5
|
+
/**
|
|
6
|
+
* Policy action type
|
|
7
|
+
*/
|
|
8
|
+
export type PolicyAction = "PERMISSIVE" | "RESTRICTIVE";
|
|
9
|
+
/**
|
|
10
|
+
* Available policy templates for storage buckets.
|
|
11
|
+
*
|
|
12
|
+
* Each template defines access rules for different roles:
|
|
13
|
+
* - `anon`: Unauthenticated users (no JWT or anon key)
|
|
14
|
+
* - `authenticated`: Logged-in users with valid JWT
|
|
15
|
+
* - `service_role`: Backend services with service_role key (bypasses RLS)
|
|
16
|
+
*
|
|
17
|
+
* Note: Basejump account-level access (owner/member) is not handled by these
|
|
18
|
+
* templates. For account-based access, use custom policies with JWT claims
|
|
19
|
+
* like `auth.jwt()->>'account_id'`.
|
|
20
|
+
*
|
|
21
|
+
* ## Template Access Matrix
|
|
22
|
+
*
|
|
23
|
+
* | Template | anon | authenticated | service_role | Notes |
|
|
24
|
+
* |-----------------|------|---------------|--------------|----------------------------------|
|
|
25
|
+
* | `ownerOnly` | ❌ | Own files | ✅ All | Uses `owner_id = auth.uid()` |
|
|
26
|
+
* | `authenticated` | ❌ | ✅ All | ✅ All | Team shared bucket |
|
|
27
|
+
* | `publicRead` | Read | Read + Write | ✅ All | CDN/public assets |
|
|
28
|
+
* | `uploadOnly` | Write| Write | ✅ All | Form submissions, inbox |
|
|
29
|
+
* | `userFolder` | ❌ | Own folder | ✅ All | Path: `/{user_id}/...` |
|
|
30
|
+
* | `adminOnly` | ❌ | ❌ | ✅ All | System/internal files |
|
|
31
|
+
*/
|
|
32
|
+
export type PolicyTemplate = "ownerOnly" | "authenticated" | "publicRead" | "uploadOnly" | "userFolder" | "adminOnly";
|
|
33
|
+
/**
|
|
34
|
+
* Input for creating a single policy
|
|
35
|
+
*/
|
|
36
|
+
export interface StoragePolicyInput {
|
|
37
|
+
/** Policy name (will be snake_cased) */
|
|
38
|
+
name: string;
|
|
39
|
+
/** SQL command this policy applies to */
|
|
40
|
+
command: PolicyCommand;
|
|
41
|
+
/** Roles this policy applies to */
|
|
42
|
+
roles: string[];
|
|
43
|
+
/** SQL expression for USING clause (SELECT/UPDATE/DELETE) */
|
|
44
|
+
definition: string;
|
|
45
|
+
/** SQL expression for WITH CHECK clause (INSERT/UPDATE) */
|
|
46
|
+
check?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Full policy as returned from API
|
|
50
|
+
*/
|
|
51
|
+
export interface StoragePolicy {
|
|
52
|
+
/** Policy ID */
|
|
53
|
+
id: number;
|
|
54
|
+
/** Policy name */
|
|
55
|
+
name: string;
|
|
56
|
+
/** Schema (always "storage" for storage policies) */
|
|
57
|
+
schema: string;
|
|
58
|
+
/** Table (always "objects" for storage policies) */
|
|
59
|
+
table: string;
|
|
60
|
+
/** Policy action */
|
|
61
|
+
action: PolicyAction;
|
|
62
|
+
/** SQL command */
|
|
63
|
+
command: PolicyCommand;
|
|
64
|
+
/** Roles this policy applies to */
|
|
65
|
+
roles: string[];
|
|
66
|
+
/** USING clause expression */
|
|
67
|
+
definition: string | null;
|
|
68
|
+
/** WITH CHECK clause expression */
|
|
69
|
+
check: string | null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Set of policies for all CRUD operations
|
|
73
|
+
*/
|
|
74
|
+
export interface StoragePolicySet {
|
|
75
|
+
select?: StoragePolicyInput;
|
|
76
|
+
insert?: StoragePolicyInput;
|
|
77
|
+
update?: StoragePolicyInput;
|
|
78
|
+
delete?: StoragePolicyInput;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Raw policy from postgres-meta API
|
|
82
|
+
*/
|
|
83
|
+
export interface ApiPolicy {
|
|
84
|
+
id: number;
|
|
85
|
+
name: string;
|
|
86
|
+
schema: string;
|
|
87
|
+
table: string;
|
|
88
|
+
action: string;
|
|
89
|
+
command: string;
|
|
90
|
+
roles: string[];
|
|
91
|
+
definition: string | null;
|
|
92
|
+
check: string | null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Normalize API policy to SDK format
|
|
96
|
+
*/
|
|
97
|
+
export declare function normalizePolicy(policy: ApiPolicy): StoragePolicy;
|
|
98
|
+
//# sourceMappingURL=policy-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-types.d.ts","sourceRoot":"","sources":["../../src/storage/policy-types.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9E;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,aAAa,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,eAAe,GACf,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,WAAW,CAAC;AAEhB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,OAAO,EAAE,aAAa,CAAC;IACvB,mCAAmC;IACnC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,mCAAmC;IACnC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mCAAmC;IACnC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAMD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAYhE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// Storage Policy Types
|
|
3
|
+
// ============================================
|
|
4
|
+
/**
|
|
5
|
+
* Normalize API policy to SDK format
|
|
6
|
+
*/
|
|
7
|
+
export function normalizePolicy(policy) {
|
|
8
|
+
return {
|
|
9
|
+
id: policy.id,
|
|
10
|
+
name: policy.name,
|
|
11
|
+
schema: policy.schema,
|
|
12
|
+
table: policy.table,
|
|
13
|
+
action: policy.action,
|
|
14
|
+
command: policy.command,
|
|
15
|
+
roles: policy.roles,
|
|
16
|
+
definition: policy.definition,
|
|
17
|
+
check: policy.check,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=policy-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-types.js","sourceRoot":"","sources":["../../src/storage/policy-types.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,uBAAuB;AACvB,+CAA+C;AAgH/C;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAsB;QACrC,OAAO,EAAE,MAAM,CAAC,OAAwB;QACxC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { HttpClient } from "../lib/http.js";
|
|
2
|
+
import type { IStorageClient, IBucketRef } from "./interface.js";
|
|
3
|
+
import { type Bucket, type CreateBucketOptions, type UpdateBucketOptions } from "./types.js";
|
|
4
|
+
import { type IStoragePoliciesClient } from "./policies-client.js";
|
|
5
|
+
/**
|
|
6
|
+
* Storage client configuration
|
|
7
|
+
*/
|
|
8
|
+
export interface StorageClientConfig {
|
|
9
|
+
http: HttpClient;
|
|
10
|
+
tenantId: string;
|
|
11
|
+
/** Account ID for admin operations (policies, etc.) */
|
|
12
|
+
accountId?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Storage client for bucket and object operations
|
|
16
|
+
*/
|
|
17
|
+
export declare class StorageClient implements IStorageClient {
|
|
18
|
+
private readonly http;
|
|
19
|
+
private readonly tenantId;
|
|
20
|
+
/** Policies client (null if accountId not provided) */
|
|
21
|
+
readonly policies: IStoragePoliciesClient | null;
|
|
22
|
+
constructor(config: StorageClientConfig);
|
|
23
|
+
private path;
|
|
24
|
+
listBuckets(): Promise<Bucket[]>;
|
|
25
|
+
getBucket(id: string): Promise<Bucket>;
|
|
26
|
+
createBucket(options: CreateBucketOptions): Promise<Bucket>;
|
|
27
|
+
updateBucket(id: string, options: UpdateBucketOptions): Promise<Bucket>;
|
|
28
|
+
deleteBucket(id: string): Promise<void>;
|
|
29
|
+
emptyBucket(id: string): Promise<void>;
|
|
30
|
+
from(bucketId: string): IBucketRef;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=storage-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-client.d.ts","sourceRoot":"","sources":["../../src/storage/storage-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAEzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAAC;gBAErC,MAAM,EAAE,mBAAmB;IAgBvC,OAAO,CAAC,IAAI;IAIN,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAShC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAStC,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB3D,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC;IAgBZ,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;CAGnC"}
|