@moogodev/client 0.2.2 → 0.2.4
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/dist/client.d.ts +9 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +78 -15
- package/dist/errors.js +1 -1
- package/dist/esm/client.d.ts +9 -0
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +78 -15
- package/dist/esm/errors.js +1 -1
- package/dist/esm/types.d.ts +1 -2
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/types.d.ts +1 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +83 -15
- package/src/errors.ts +1 -1
- package/src/types.ts +1 -2
- package/tsconfig.json +1 -0
package/dist/client.d.ts
CHANGED
|
@@ -64,6 +64,15 @@ export declare class MoogoClient {
|
|
|
64
64
|
updateBucket(bucketId: string, request: UpdateBucketRequest): Promise<Bucket>;
|
|
65
65
|
/** Delete a bucket and all its objects */
|
|
66
66
|
deleteBucket(bucketId: string): Promise<void>;
|
|
67
|
+
/** S3-compatible download (R2 wire-compat) via /s3/{bucket}/{key}
|
|
68
|
+
* Note: This endpoint is protected by SigV4 middleware. For private objects,
|
|
69
|
+
* the SDK must send a valid HMAC-SHA256 signature (not implemented in this
|
|
70
|
+
* version). Public objects are accessible without auth; private objects require
|
|
71
|
+
* either the signed URL from getPresignedUrl or the storage credential with
|
|
72
|
+
* full SigV4 signing. */
|
|
73
|
+
s3Download(bucketName: string, key: string, opts?: {
|
|
74
|
+
signal?: AbortSignal;
|
|
75
|
+
}): Promise<Response>;
|
|
67
76
|
/** Toggle bucket public/private (fans out to all objects) */
|
|
68
77
|
setBucketPublic(bucketId: string, isPublic: boolean): Promise<Bucket>;
|
|
69
78
|
/**
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EAEnB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAEjB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EAGxB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -11,6 +11,25 @@ exports.createClientFromEnv = createClientFromEnv;
|
|
|
11
11
|
const errors_js_1 = require("./errors.js");
|
|
12
12
|
/** Default timeout: 30 seconds */
|
|
13
13
|
const DEFAULT_TIMEOUT = 30_000;
|
|
14
|
+
// Polyfill for AbortSignal.any — available natively in Node 20+ / modern
|
|
15
|
+
// browsers but not in older runtimes, which made every abort-aware client
|
|
16
|
+
// method throw on invocation. Combines multiple signals into one AbortSignal.
|
|
17
|
+
if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.any !== 'function') {
|
|
18
|
+
AbortSignal.any = function (signals) {
|
|
19
|
+
const controller = new AbortController();
|
|
20
|
+
const onAbort = () => controller.abort();
|
|
21
|
+
for (const signal of signals) {
|
|
22
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
23
|
+
}
|
|
24
|
+
const cleanup = () => {
|
|
25
|
+
for (const signal of signals) {
|
|
26
|
+
signal.removeEventListener('abort', onAbort);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
controller.signal.addEventListener('abort', cleanup, { once: true });
|
|
30
|
+
return controller.signal;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
14
33
|
/**
|
|
15
34
|
* Moogo client for object storage operations.
|
|
16
35
|
*
|
|
@@ -84,7 +103,9 @@ class MoogoClient {
|
|
|
84
103
|
/** Detect auth mode from secret key prefix */
|
|
85
104
|
detectAuthMode() {
|
|
86
105
|
// moogo_sk_ = Bearer token (current API)
|
|
87
|
-
// moogo_hmac_ = HMAC-SHA256 (legacy/enterprise)
|
|
106
|
+
// moogo_hmac_ = HMAC-SHA256 (legacy/enterprise) — dead code because
|
|
107
|
+
// the server expects Bearer for storage credentials; HMAC signing is
|
|
108
|
+
// not implemented in this client version (Bug 10).
|
|
88
109
|
if (this.secretKey?.startsWith('moogo_hmac_'))
|
|
89
110
|
return 'hmac';
|
|
90
111
|
return 'bearer';
|
|
@@ -260,6 +281,24 @@ class MoogoClient {
|
|
|
260
281
|
async deleteBucket(bucketId) {
|
|
261
282
|
await this.requestStorage('DELETE', `${this.getCatalogPath()}/${bucketId}`);
|
|
262
283
|
}
|
|
284
|
+
/** S3-compatible download (R2 wire-compat) via /s3/{bucket}/{key}
|
|
285
|
+
* Note: This endpoint is protected by SigV4 middleware. For private objects,
|
|
286
|
+
* the SDK must send a valid HMAC-SHA256 signature (not implemented in this
|
|
287
|
+
* version). Public objects are accessible without auth; private objects require
|
|
288
|
+
* either the signed URL from getPresignedUrl or the storage credential with
|
|
289
|
+
* full SigV4 signing. */
|
|
290
|
+
async s3Download(bucketName, key, opts) {
|
|
291
|
+
const url = `${this.baseUrl}/s3/${encodeURIComponent(bucketName)}/${encodeURIComponent(key)}`;
|
|
292
|
+
// Pass storage auth headers when available; the SigV4 middleware can
|
|
293
|
+
// fall back to bearer token for some deployments, but full HMAC signing
|
|
294
|
+
// (dead code in detectAuthMode) remains unimplemented.
|
|
295
|
+
const headers = {};
|
|
296
|
+
if (this.hasStorageCredentials()) {
|
|
297
|
+
const auth = this.getStorageAuthHeaders();
|
|
298
|
+
Object.assign(headers, auth);
|
|
299
|
+
}
|
|
300
|
+
return fetch(url, { headers, signal: opts?.signal });
|
|
301
|
+
}
|
|
263
302
|
/** Toggle bucket public/private (fans out to all objects) */
|
|
264
303
|
async setBucketPublic(bucketId, isPublic) {
|
|
265
304
|
const response = await this.requestStorage('POST', `${this.getCatalogPath()}/${bucketId}/public`, { body: JSON.stringify({ is_public: isPublic }) });
|
|
@@ -503,26 +542,40 @@ class MoogoClient {
|
|
|
503
542
|
/** Get a presigned URL for an object */
|
|
504
543
|
async getPresignedUrl(key, request, options = {}) {
|
|
505
544
|
const { bucket = 'default', signal } = options;
|
|
545
|
+
// The bucket is folded into the signed grant, so it goes in the body
|
|
546
|
+
// alongside the key, method and expiry. The server reads request.Bucket
|
|
547
|
+
// from the body; sending it as a query parameter is ignored and every
|
|
548
|
+
// PUT grant silently signs for the default bucket.
|
|
506
549
|
const path = `/p/${this.projectId}/bucket/${encodeURIComponent(key)}/sign`;
|
|
507
|
-
const
|
|
550
|
+
const body = {
|
|
551
|
+
method: request.method,
|
|
552
|
+
expires_in: request.expires_in,
|
|
553
|
+
};
|
|
508
554
|
if (bucket !== 'default')
|
|
509
|
-
|
|
555
|
+
body.bucket = bucket;
|
|
510
556
|
return this.requestStorage('POST', path, {
|
|
511
|
-
|
|
512
|
-
body: JSON.stringify(request),
|
|
557
|
+
body: JSON.stringify(body),
|
|
513
558
|
signal,
|
|
514
559
|
});
|
|
515
560
|
}
|
|
516
561
|
/** Create a signed upload URL (returns upload URL + object metadata) */
|
|
517
562
|
async createSignedUpload(key, request, options = {}) {
|
|
518
563
|
const { bucket = 'default', signal } = options;
|
|
519
|
-
|
|
520
|
-
|
|
564
|
+
// The server exposes one signing route: POST /buckets/{project_id}/sign.
|
|
565
|
+
// A PUT grant is minted by passing method: "PUT" in the body, which is
|
|
566
|
+
// what the client does here. The old /sign-upload path does not exist on
|
|
567
|
+
// the server and always answered 404.
|
|
568
|
+
const path = `/p/${this.projectId}/bucket/${encodeURIComponent(key)}/sign`;
|
|
569
|
+
const body = {
|
|
570
|
+
method: 'PUT',
|
|
571
|
+
expires_in: request.expires_in,
|
|
572
|
+
};
|
|
521
573
|
if (bucket !== 'default')
|
|
522
|
-
|
|
574
|
+
body.bucket = bucket;
|
|
575
|
+
if (request.content_type)
|
|
576
|
+
body.content_type = request.content_type;
|
|
523
577
|
return this.requestStorage('POST', path, {
|
|
524
|
-
|
|
525
|
-
body: JSON.stringify(request),
|
|
578
|
+
body: JSON.stringify(body),
|
|
526
579
|
signal,
|
|
527
580
|
});
|
|
528
581
|
}
|
|
@@ -639,23 +692,33 @@ function createSQLClient(config) {
|
|
|
639
692
|
/** Convenience function to create a client from environment variables */
|
|
640
693
|
function createClientFromEnv(env) {
|
|
641
694
|
const getEnv = (key) => env?.[key] ?? process.env[key];
|
|
642
|
-
// Standard env vars only (no legacy fallbacks)
|
|
643
695
|
const rawBase = getEnv('MOOGO_BASE_URL') || 'https://api.moogo.dev';
|
|
644
696
|
const baseUrl = rawBase.replace(/\/p\/[^/]+\/bucket.*$/, '').replace(/\/+$/, '');
|
|
697
|
+
const projectId = getEnv('MOOGO_PROJECT_ID');
|
|
698
|
+
if (!projectId) {
|
|
699
|
+
throw new Error('MOOGO_PROJECT_ID is required (Bug 18 fix: non-null assertions removed)');
|
|
700
|
+
}
|
|
645
701
|
// SQL key
|
|
646
702
|
const projectKey = getEnv('MOOGO_SQL_KEY');
|
|
647
703
|
if (projectKey) {
|
|
704
|
+
if (!projectId)
|
|
705
|
+
throw new Error('MOOGO_PROJECT_ID is required');
|
|
648
706
|
return new MoogoClient({
|
|
649
707
|
baseUrl,
|
|
650
|
-
projectId
|
|
708
|
+
projectId,
|
|
651
709
|
projectKey,
|
|
652
710
|
});
|
|
653
711
|
}
|
|
654
712
|
// Storage keys
|
|
713
|
+
const accessKeyId = getEnv('MOOGO_STORAGE_ACCESS_KEY_ID');
|
|
714
|
+
const secretKey = getEnv('MOOGO_STORAGE_SECRET_KEY');
|
|
715
|
+
if (!accessKeyId || !secretKey) {
|
|
716
|
+
throw new Error('MOOGO_STORAGE_ACCESS_KEY_ID and MOOGO_STORAGE_SECRET_KEY are required when MOOGO_SQL_KEY is not set');
|
|
717
|
+
}
|
|
655
718
|
return new MoogoClient({
|
|
656
719
|
baseUrl,
|
|
657
|
-
projectId
|
|
658
|
-
accessKeyId
|
|
659
|
-
secretKey
|
|
720
|
+
projectId,
|
|
721
|
+
accessKeyId,
|
|
722
|
+
secretKey,
|
|
660
723
|
});
|
|
661
724
|
}
|
package/dist/errors.js
CHANGED
|
@@ -134,7 +134,7 @@ class LinkExpiredError extends MoogoError {
|
|
|
134
134
|
exports.LinkExpiredError = LinkExpiredError;
|
|
135
135
|
class NotFoundError extends MoogoError {
|
|
136
136
|
constructor(detail) {
|
|
137
|
-
super('not_found', 'Bucket/object missing or not published.
|
|
137
|
+
super('not_found', 'Bucket/object missing or not published. Visibility is bucket-level: make the bucket public (POST /buckets/{id}/public) rather than toggling per-object. Private objects return 404 on /pub/ routes.', 404, detail);
|
|
138
138
|
this.name = 'NotFoundError';
|
|
139
139
|
Object.setPrototypeOf(this, NotFoundError.prototype);
|
|
140
140
|
}
|
package/dist/esm/client.d.ts
CHANGED
|
@@ -64,6 +64,15 @@ export declare class MoogoClient {
|
|
|
64
64
|
updateBucket(bucketId: string, request: UpdateBucketRequest): Promise<Bucket>;
|
|
65
65
|
/** Delete a bucket and all its objects */
|
|
66
66
|
deleteBucket(bucketId: string): Promise<void>;
|
|
67
|
+
/** S3-compatible download (R2 wire-compat) via /s3/{bucket}/{key}
|
|
68
|
+
* Note: This endpoint is protected by SigV4 middleware. For private objects,
|
|
69
|
+
* the SDK must send a valid HMAC-SHA256 signature (not implemented in this
|
|
70
|
+
* version). Public objects are accessible without auth; private objects require
|
|
71
|
+
* either the signed URL from getPresignedUrl or the storage credential with
|
|
72
|
+
* full SigV4 signing. */
|
|
73
|
+
s3Download(bucketName: string, key: string, opts?: {
|
|
74
|
+
signal?: AbortSignal;
|
|
75
|
+
}): Promise<Response>;
|
|
67
76
|
/** Toggle bucket public/private (fans out to all objects) */
|
|
68
77
|
setBucketPublic(bucketId: string, isPublic: boolean): Promise<Bucket>;
|
|
69
78
|
/**
|
package/dist/esm/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EAEnB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAEjB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EAGxB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/client.js
CHANGED
|
@@ -5,6 +5,25 @@
|
|
|
5
5
|
import { MoogoError, createErrorFromResponse, } from './errors.js';
|
|
6
6
|
/** Default timeout: 30 seconds */
|
|
7
7
|
const DEFAULT_TIMEOUT = 30_000;
|
|
8
|
+
// Polyfill for AbortSignal.any — available natively in Node 20+ / modern
|
|
9
|
+
// browsers but not in older runtimes, which made every abort-aware client
|
|
10
|
+
// method throw on invocation. Combines multiple signals into one AbortSignal.
|
|
11
|
+
if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.any !== 'function') {
|
|
12
|
+
AbortSignal.any = function (signals) {
|
|
13
|
+
const controller = new AbortController();
|
|
14
|
+
const onAbort = () => controller.abort();
|
|
15
|
+
for (const signal of signals) {
|
|
16
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
17
|
+
}
|
|
18
|
+
const cleanup = () => {
|
|
19
|
+
for (const signal of signals) {
|
|
20
|
+
signal.removeEventListener('abort', onAbort);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
controller.signal.addEventListener('abort', cleanup, { once: true });
|
|
24
|
+
return controller.signal;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
8
27
|
/**
|
|
9
28
|
* Moogo client for object storage operations.
|
|
10
29
|
*
|
|
@@ -78,7 +97,9 @@ export class MoogoClient {
|
|
|
78
97
|
/** Detect auth mode from secret key prefix */
|
|
79
98
|
detectAuthMode() {
|
|
80
99
|
// moogo_sk_ = Bearer token (current API)
|
|
81
|
-
// moogo_hmac_ = HMAC-SHA256 (legacy/enterprise)
|
|
100
|
+
// moogo_hmac_ = HMAC-SHA256 (legacy/enterprise) — dead code because
|
|
101
|
+
// the server expects Bearer for storage credentials; HMAC signing is
|
|
102
|
+
// not implemented in this client version (Bug 10).
|
|
82
103
|
if (this.secretKey?.startsWith('moogo_hmac_'))
|
|
83
104
|
return 'hmac';
|
|
84
105
|
return 'bearer';
|
|
@@ -254,6 +275,24 @@ export class MoogoClient {
|
|
|
254
275
|
async deleteBucket(bucketId) {
|
|
255
276
|
await this.requestStorage('DELETE', `${this.getCatalogPath()}/${bucketId}`);
|
|
256
277
|
}
|
|
278
|
+
/** S3-compatible download (R2 wire-compat) via /s3/{bucket}/{key}
|
|
279
|
+
* Note: This endpoint is protected by SigV4 middleware. For private objects,
|
|
280
|
+
* the SDK must send a valid HMAC-SHA256 signature (not implemented in this
|
|
281
|
+
* version). Public objects are accessible without auth; private objects require
|
|
282
|
+
* either the signed URL from getPresignedUrl or the storage credential with
|
|
283
|
+
* full SigV4 signing. */
|
|
284
|
+
async s3Download(bucketName, key, opts) {
|
|
285
|
+
const url = `${this.baseUrl}/s3/${encodeURIComponent(bucketName)}/${encodeURIComponent(key)}`;
|
|
286
|
+
// Pass storage auth headers when available; the SigV4 middleware can
|
|
287
|
+
// fall back to bearer token for some deployments, but full HMAC signing
|
|
288
|
+
// (dead code in detectAuthMode) remains unimplemented.
|
|
289
|
+
const headers = {};
|
|
290
|
+
if (this.hasStorageCredentials()) {
|
|
291
|
+
const auth = this.getStorageAuthHeaders();
|
|
292
|
+
Object.assign(headers, auth);
|
|
293
|
+
}
|
|
294
|
+
return fetch(url, { headers, signal: opts?.signal });
|
|
295
|
+
}
|
|
257
296
|
/** Toggle bucket public/private (fans out to all objects) */
|
|
258
297
|
async setBucketPublic(bucketId, isPublic) {
|
|
259
298
|
const response = await this.requestStorage('POST', `${this.getCatalogPath()}/${bucketId}/public`, { body: JSON.stringify({ is_public: isPublic }) });
|
|
@@ -497,26 +536,40 @@ export class MoogoClient {
|
|
|
497
536
|
/** Get a presigned URL for an object */
|
|
498
537
|
async getPresignedUrl(key, request, options = {}) {
|
|
499
538
|
const { bucket = 'default', signal } = options;
|
|
539
|
+
// The bucket is folded into the signed grant, so it goes in the body
|
|
540
|
+
// alongside the key, method and expiry. The server reads request.Bucket
|
|
541
|
+
// from the body; sending it as a query parameter is ignored and every
|
|
542
|
+
// PUT grant silently signs for the default bucket.
|
|
500
543
|
const path = `/p/${this.projectId}/bucket/${encodeURIComponent(key)}/sign`;
|
|
501
|
-
const
|
|
544
|
+
const body = {
|
|
545
|
+
method: request.method,
|
|
546
|
+
expires_in: request.expires_in,
|
|
547
|
+
};
|
|
502
548
|
if (bucket !== 'default')
|
|
503
|
-
|
|
549
|
+
body.bucket = bucket;
|
|
504
550
|
return this.requestStorage('POST', path, {
|
|
505
|
-
|
|
506
|
-
body: JSON.stringify(request),
|
|
551
|
+
body: JSON.stringify(body),
|
|
507
552
|
signal,
|
|
508
553
|
});
|
|
509
554
|
}
|
|
510
555
|
/** Create a signed upload URL (returns upload URL + object metadata) */
|
|
511
556
|
async createSignedUpload(key, request, options = {}) {
|
|
512
557
|
const { bucket = 'default', signal } = options;
|
|
513
|
-
|
|
514
|
-
|
|
558
|
+
// The server exposes one signing route: POST /buckets/{project_id}/sign.
|
|
559
|
+
// A PUT grant is minted by passing method: "PUT" in the body, which is
|
|
560
|
+
// what the client does here. The old /sign-upload path does not exist on
|
|
561
|
+
// the server and always answered 404.
|
|
562
|
+
const path = `/p/${this.projectId}/bucket/${encodeURIComponent(key)}/sign`;
|
|
563
|
+
const body = {
|
|
564
|
+
method: 'PUT',
|
|
565
|
+
expires_in: request.expires_in,
|
|
566
|
+
};
|
|
515
567
|
if (bucket !== 'default')
|
|
516
|
-
|
|
568
|
+
body.bucket = bucket;
|
|
569
|
+
if (request.content_type)
|
|
570
|
+
body.content_type = request.content_type;
|
|
517
571
|
return this.requestStorage('POST', path, {
|
|
518
|
-
|
|
519
|
-
body: JSON.stringify(request),
|
|
572
|
+
body: JSON.stringify(body),
|
|
520
573
|
signal,
|
|
521
574
|
});
|
|
522
575
|
}
|
|
@@ -632,23 +685,33 @@ export function createSQLClient(config) {
|
|
|
632
685
|
/** Convenience function to create a client from environment variables */
|
|
633
686
|
export function createClientFromEnv(env) {
|
|
634
687
|
const getEnv = (key) => env?.[key] ?? process.env[key];
|
|
635
|
-
// Standard env vars only (no legacy fallbacks)
|
|
636
688
|
const rawBase = getEnv('MOOGO_BASE_URL') || 'https://api.moogo.dev';
|
|
637
689
|
const baseUrl = rawBase.replace(/\/p\/[^/]+\/bucket.*$/, '').replace(/\/+$/, '');
|
|
690
|
+
const projectId = getEnv('MOOGO_PROJECT_ID');
|
|
691
|
+
if (!projectId) {
|
|
692
|
+
throw new Error('MOOGO_PROJECT_ID is required (Bug 18 fix: non-null assertions removed)');
|
|
693
|
+
}
|
|
638
694
|
// SQL key
|
|
639
695
|
const projectKey = getEnv('MOOGO_SQL_KEY');
|
|
640
696
|
if (projectKey) {
|
|
697
|
+
if (!projectId)
|
|
698
|
+
throw new Error('MOOGO_PROJECT_ID is required');
|
|
641
699
|
return new MoogoClient({
|
|
642
700
|
baseUrl,
|
|
643
|
-
projectId
|
|
701
|
+
projectId,
|
|
644
702
|
projectKey,
|
|
645
703
|
});
|
|
646
704
|
}
|
|
647
705
|
// Storage keys
|
|
706
|
+
const accessKeyId = getEnv('MOOGO_STORAGE_ACCESS_KEY_ID');
|
|
707
|
+
const secretKey = getEnv('MOOGO_STORAGE_SECRET_KEY');
|
|
708
|
+
if (!accessKeyId || !secretKey) {
|
|
709
|
+
throw new Error('MOOGO_STORAGE_ACCESS_KEY_ID and MOOGO_STORAGE_SECRET_KEY are required when MOOGO_SQL_KEY is not set');
|
|
710
|
+
}
|
|
648
711
|
return new MoogoClient({
|
|
649
712
|
baseUrl,
|
|
650
|
-
projectId
|
|
651
|
-
accessKeyId
|
|
652
|
-
secretKey
|
|
713
|
+
projectId,
|
|
714
|
+
accessKeyId,
|
|
715
|
+
secretKey,
|
|
653
716
|
});
|
|
654
717
|
}
|
package/dist/esm/errors.js
CHANGED
|
@@ -116,7 +116,7 @@ export class LinkExpiredError extends MoogoError {
|
|
|
116
116
|
}
|
|
117
117
|
export class NotFoundError extends MoogoError {
|
|
118
118
|
constructor(detail) {
|
|
119
|
-
super('not_found', 'Bucket/object missing or not published.
|
|
119
|
+
super('not_found', 'Bucket/object missing or not published. Visibility is bucket-level: make the bucket public (POST /buckets/{id}/public) rather than toggling per-object. Private objects return 404 on /pub/ routes.', 404, detail);
|
|
120
120
|
this.name = 'NotFoundError';
|
|
121
121
|
Object.setPrototypeOf(this, NotFoundError.prototype);
|
|
122
122
|
}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -61,9 +61,8 @@ export interface CreateBucketRequest {
|
|
|
61
61
|
max_object_size_bytes?: number;
|
|
62
62
|
quota_bytes?: number;
|
|
63
63
|
}
|
|
64
|
-
/** Bucket update request */
|
|
64
|
+
/** Bucket update request (dashboard-only; visibility is handled via /public endpoint) */
|
|
65
65
|
export interface UpdateBucketRequest {
|
|
66
|
-
is_public?: boolean;
|
|
67
66
|
allowed_types?: string[];
|
|
68
67
|
max_object_size_bytes?: number;
|
|
69
68
|
quota_bytes?: number;
|
package/dist/esm/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kCAAkC;AAClC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,iCAAiC;AACjC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC9B,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,kDAAkD;AAClD,MAAM,WAAW,cAAe,SAAQ,UAAU;CAAG;AAErD,2BAA2B;AAC3B,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,8BAA8B;AAC9B,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -61,9 +61,8 @@ export interface CreateBucketRequest {
|
|
|
61
61
|
max_object_size_bytes?: number;
|
|
62
62
|
quota_bytes?: number;
|
|
63
63
|
}
|
|
64
|
-
/** Bucket update request */
|
|
64
|
+
/** Bucket update request (dashboard-only; visibility is handled via /public endpoint) */
|
|
65
65
|
export interface UpdateBucketRequest {
|
|
66
|
-
is_public?: boolean;
|
|
67
66
|
allowed_types?: string[];
|
|
68
67
|
max_object_size_bytes?: number;
|
|
69
68
|
quota_bytes?: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kCAAkC;AAClC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,iCAAiC;AACjC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC9B,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,kDAAkD;AAClD,MAAM,WAAW,cAAe,SAAQ,UAAU;CAAG;AAErD,2BAA2B;AAC3B,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,8BAA8B;AAC9B,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -40,6 +40,30 @@ import {
|
|
|
40
40
|
/** Default timeout: 30 seconds */
|
|
41
41
|
const DEFAULT_TIMEOUT = 30_000;
|
|
42
42
|
|
|
43
|
+
// Polyfill for AbortSignal.any — available natively in Node 20+ / modern
|
|
44
|
+
// browsers but not in older runtimes, which made every abort-aware client
|
|
45
|
+
// method throw on invocation. Combines multiple signals into one AbortSignal.
|
|
46
|
+
if (typeof AbortSignal !== 'undefined' && typeof (AbortSignal as any).any !== 'function') {
|
|
47
|
+
(AbortSignal as any).any = function (signals: AbortSignal[]): AbortSignal {
|
|
48
|
+
const controller = new AbortController();
|
|
49
|
+
const onAbort = () => controller.abort();
|
|
50
|
+
|
|
51
|
+
for (const signal of signals) {
|
|
52
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const cleanup = () => {
|
|
56
|
+
for (const signal of signals) {
|
|
57
|
+
signal.removeEventListener('abort', onAbort);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
controller.signal.addEventListener('abort', cleanup, { once: true });
|
|
62
|
+
|
|
63
|
+
return controller.signal;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
43
67
|
/**
|
|
44
68
|
* Moogo client for object storage operations.
|
|
45
69
|
*
|
|
@@ -118,7 +142,9 @@ export class MoogoClient {
|
|
|
118
142
|
/** Detect auth mode from secret key prefix */
|
|
119
143
|
private detectAuthMode(): 'bearer' | 'hmac' {
|
|
120
144
|
// moogo_sk_ = Bearer token (current API)
|
|
121
|
-
// moogo_hmac_ = HMAC-SHA256 (legacy/enterprise)
|
|
145
|
+
// moogo_hmac_ = HMAC-SHA256 (legacy/enterprise) — dead code because
|
|
146
|
+
// the server expects Bearer for storage credentials; HMAC signing is
|
|
147
|
+
// not implemented in this client version (Bug 10).
|
|
122
148
|
if (this.secretKey?.startsWith('moogo_hmac_')) return 'hmac';
|
|
123
149
|
return 'bearer';
|
|
124
150
|
}
|
|
@@ -348,6 +374,25 @@ export class MoogoClient {
|
|
|
348
374
|
await this.requestStorage<DeleteResponse>('DELETE', `${this.getCatalogPath()}/${bucketId}`);
|
|
349
375
|
}
|
|
350
376
|
|
|
377
|
+
/** S3-compatible download (R2 wire-compat) via /s3/{bucket}/{key}
|
|
378
|
+
* Note: This endpoint is protected by SigV4 middleware. For private objects,
|
|
379
|
+
* the SDK must send a valid HMAC-SHA256 signature (not implemented in this
|
|
380
|
+
* version). Public objects are accessible without auth; private objects require
|
|
381
|
+
* either the signed URL from getPresignedUrl or the storage credential with
|
|
382
|
+
* full SigV4 signing. */
|
|
383
|
+
async s3Download(bucketName: string, key: string, opts?: { signal?: AbortSignal }): Promise<Response> {
|
|
384
|
+
const url = `${this.baseUrl}/s3/${encodeURIComponent(bucketName)}/${encodeURIComponent(key)}`;
|
|
385
|
+
// Pass storage auth headers when available; the SigV4 middleware can
|
|
386
|
+
// fall back to bearer token for some deployments, but full HMAC signing
|
|
387
|
+
// (dead code in detectAuthMode) remains unimplemented.
|
|
388
|
+
const headers: Record<string, string> = {};
|
|
389
|
+
if (this.hasStorageCredentials()) {
|
|
390
|
+
const auth = this.getStorageAuthHeaders();
|
|
391
|
+
Object.assign(headers, auth);
|
|
392
|
+
}
|
|
393
|
+
return fetch(url, { headers, signal: opts?.signal });
|
|
394
|
+
}
|
|
395
|
+
|
|
351
396
|
/** Toggle bucket public/private (fans out to all objects) */
|
|
352
397
|
async setBucketPublic(bucketId: string, isPublic: boolean): Promise<Bucket> {
|
|
353
398
|
const response = await this.requestStorage<{ success: true; bucket: Bucket }>(
|
|
@@ -646,13 +691,19 @@ export class MoogoClient {
|
|
|
646
691
|
): Promise<PresignedUrlResponse> {
|
|
647
692
|
const { bucket = 'default', signal } = options;
|
|
648
693
|
|
|
694
|
+
// The bucket is folded into the signed grant, so it goes in the body
|
|
695
|
+
// alongside the key, method and expiry. The server reads request.Bucket
|
|
696
|
+
// from the body; sending it as a query parameter is ignored and every
|
|
697
|
+
// PUT grant silently signs for the default bucket.
|
|
649
698
|
const path = `/p/${this.projectId}/bucket/${encodeURIComponent(key)}/sign`;
|
|
650
|
-
const
|
|
651
|
-
|
|
699
|
+
const body: Record<string, any> = {
|
|
700
|
+
method: request.method,
|
|
701
|
+
expires_in: request.expires_in,
|
|
702
|
+
};
|
|
703
|
+
if (bucket !== 'default') body.bucket = bucket;
|
|
652
704
|
|
|
653
705
|
return this.requestStorage<PresignedUrlResponse>('POST', path, {
|
|
654
|
-
|
|
655
|
-
body: JSON.stringify(request),
|
|
706
|
+
body: JSON.stringify(body),
|
|
656
707
|
signal,
|
|
657
708
|
});
|
|
658
709
|
}
|
|
@@ -665,13 +716,20 @@ export class MoogoClient {
|
|
|
665
716
|
): Promise<SignedUploadResponse> {
|
|
666
717
|
const { bucket = 'default', signal } = options;
|
|
667
718
|
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
719
|
+
// The server exposes one signing route: POST /buckets/{project_id}/sign.
|
|
720
|
+
// A PUT grant is minted by passing method: "PUT" in the body, which is
|
|
721
|
+
// what the client does here. The old /sign-upload path does not exist on
|
|
722
|
+
// the server and always answered 404.
|
|
723
|
+
const path = `/p/${this.projectId}/bucket/${encodeURIComponent(key)}/sign`;
|
|
724
|
+
const body: Record<string, any> = {
|
|
725
|
+
method: 'PUT',
|
|
726
|
+
expires_in: request.expires_in,
|
|
727
|
+
};
|
|
728
|
+
if (bucket !== 'default') body.bucket = bucket;
|
|
729
|
+
if (request.content_type) body.content_type = request.content_type;
|
|
671
730
|
|
|
672
731
|
return this.requestStorage<SignedUploadResponse>('POST', path, {
|
|
673
|
-
|
|
674
|
-
body: JSON.stringify(request),
|
|
732
|
+
body: JSON.stringify(body),
|
|
675
733
|
signal,
|
|
676
734
|
});
|
|
677
735
|
}
|
|
@@ -845,24 +903,34 @@ export function createSQLClient(config: {
|
|
|
845
903
|
export function createClientFromEnv(env?: Record<string, string | undefined>): MoogoClient {
|
|
846
904
|
const getEnv = (key: string) => env?.[key] ?? process.env[key];
|
|
847
905
|
|
|
848
|
-
// Standard env vars only (no legacy fallbacks)
|
|
849
906
|
const rawBase = getEnv('MOOGO_BASE_URL') || 'https://api.moogo.dev';
|
|
850
907
|
const baseUrl = rawBase.replace(/\/p\/[^/]+\/bucket.*$/, '').replace(/\/+$/, '');
|
|
851
908
|
|
|
909
|
+
const projectId = getEnv('MOOGO_PROJECT_ID');
|
|
910
|
+
if (!projectId) {
|
|
911
|
+
throw new Error('MOOGO_PROJECT_ID is required (Bug 18 fix: non-null assertions removed)');
|
|
912
|
+
}
|
|
913
|
+
|
|
852
914
|
// SQL key
|
|
853
915
|
const projectKey = getEnv('MOOGO_SQL_KEY');
|
|
854
916
|
if (projectKey) {
|
|
917
|
+
if (!projectId) throw new Error('MOOGO_PROJECT_ID is required');
|
|
855
918
|
return new MoogoClient({
|
|
856
919
|
baseUrl,
|
|
857
|
-
projectId
|
|
920
|
+
projectId,
|
|
858
921
|
projectKey,
|
|
859
922
|
});
|
|
860
923
|
}
|
|
861
924
|
// Storage keys
|
|
925
|
+
const accessKeyId = getEnv('MOOGO_STORAGE_ACCESS_KEY_ID');
|
|
926
|
+
const secretKey = getEnv('MOOGO_STORAGE_SECRET_KEY');
|
|
927
|
+
if (!accessKeyId || !secretKey) {
|
|
928
|
+
throw new Error('MOOGO_STORAGE_ACCESS_KEY_ID and MOOGO_STORAGE_SECRET_KEY are required when MOOGO_SQL_KEY is not set');
|
|
929
|
+
}
|
|
862
930
|
return new MoogoClient({
|
|
863
931
|
baseUrl,
|
|
864
|
-
projectId
|
|
865
|
-
accessKeyId
|
|
866
|
-
secretKey
|
|
932
|
+
projectId,
|
|
933
|
+
accessKeyId,
|
|
934
|
+
secretKey,
|
|
867
935
|
});
|
|
868
936
|
}
|
package/src/errors.ts
CHANGED
|
@@ -142,7 +142,7 @@ export class LinkExpiredError extends MoogoError {
|
|
|
142
142
|
|
|
143
143
|
export class NotFoundError extends MoogoError {
|
|
144
144
|
constructor(detail?: string) {
|
|
145
|
-
super('not_found', 'Bucket/object missing or not published.
|
|
145
|
+
super('not_found', 'Bucket/object missing or not published. Visibility is bucket-level: make the bucket public (POST /buckets/{id}/public) rather than toggling per-object. Private objects return 404 on /pub/ routes.', 404, detail);
|
|
146
146
|
this.name = 'NotFoundError';
|
|
147
147
|
Object.setPrototypeOf(this, NotFoundError.prototype);
|
|
148
148
|
}
|
package/src/types.ts
CHANGED
|
@@ -69,9 +69,8 @@ export interface CreateBucketRequest {
|
|
|
69
69
|
quota_bytes?: number;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
/** Bucket update request */
|
|
72
|
+
/** Bucket update request (dashboard-only; visibility is handled via /public endpoint) */
|
|
73
73
|
export interface UpdateBucketRequest {
|
|
74
|
-
is_public?: boolean;
|
|
75
74
|
allowed_types?: string[];
|
|
76
75
|
max_object_size_bytes?: number;
|
|
77
76
|
quota_bytes?: number;
|