@moogodev/client 0.2.3 → 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 +6 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +76 -17
- package/dist/errors.js +1 -1
- package/dist/esm/client.d.ts +6 -1
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +76 -17
- 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 +80 -17
- package/src/errors.ts +1 -1
- package/src/types.ts +1 -2
package/dist/client.d.ts
CHANGED
|
@@ -64,7 +64,12 @@ 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}
|
|
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. */
|
|
68
73
|
s3Download(bucketName: string, key: string, opts?: {
|
|
69
74
|
signal?: AbortSignal;
|
|
70
75
|
}): Promise<Response>;
|
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,9 +281,23 @@ class MoogoClient {
|
|
|
260
281
|
async deleteBucket(bucketId) {
|
|
261
282
|
await this.requestStorage('DELETE', `${this.getCatalogPath()}/${bucketId}`);
|
|
262
283
|
}
|
|
263
|
-
/** S3-compatible download (R2 wire-compat) via /s3/{bucket}/{key}
|
|
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. */
|
|
264
290
|
async s3Download(bucketName, key, opts) {
|
|
265
|
-
|
|
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 });
|
|
266
301
|
}
|
|
267
302
|
/** Toggle bucket public/private (fans out to all objects) */
|
|
268
303
|
async setBucketPublic(bucketId, isPublic) {
|
|
@@ -507,26 +542,40 @@ class MoogoClient {
|
|
|
507
542
|
/** Get a presigned URL for an object */
|
|
508
543
|
async getPresignedUrl(key, request, options = {}) {
|
|
509
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.
|
|
510
549
|
const path = `/p/${this.projectId}/bucket/${encodeURIComponent(key)}/sign`;
|
|
511
|
-
const
|
|
550
|
+
const body = {
|
|
551
|
+
method: request.method,
|
|
552
|
+
expires_in: request.expires_in,
|
|
553
|
+
};
|
|
512
554
|
if (bucket !== 'default')
|
|
513
|
-
|
|
555
|
+
body.bucket = bucket;
|
|
514
556
|
return this.requestStorage('POST', path, {
|
|
515
|
-
|
|
516
|
-
body: JSON.stringify(request),
|
|
557
|
+
body: JSON.stringify(body),
|
|
517
558
|
signal,
|
|
518
559
|
});
|
|
519
560
|
}
|
|
520
561
|
/** Create a signed upload URL (returns upload URL + object metadata) */
|
|
521
562
|
async createSignedUpload(key, request, options = {}) {
|
|
522
563
|
const { bucket = 'default', signal } = options;
|
|
523
|
-
|
|
524
|
-
|
|
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
|
+
};
|
|
525
573
|
if (bucket !== 'default')
|
|
526
|
-
|
|
574
|
+
body.bucket = bucket;
|
|
575
|
+
if (request.content_type)
|
|
576
|
+
body.content_type = request.content_type;
|
|
527
577
|
return this.requestStorage('POST', path, {
|
|
528
|
-
|
|
529
|
-
body: JSON.stringify(request),
|
|
578
|
+
body: JSON.stringify(body),
|
|
530
579
|
signal,
|
|
531
580
|
});
|
|
532
581
|
}
|
|
@@ -643,23 +692,33 @@ function createSQLClient(config) {
|
|
|
643
692
|
/** Convenience function to create a client from environment variables */
|
|
644
693
|
function createClientFromEnv(env) {
|
|
645
694
|
const getEnv = (key) => env?.[key] ?? process.env[key];
|
|
646
|
-
// Standard env vars only (no legacy fallbacks)
|
|
647
695
|
const rawBase = getEnv('MOOGO_BASE_URL') || 'https://api.moogo.dev';
|
|
648
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
|
+
}
|
|
649
701
|
// SQL key
|
|
650
702
|
const projectKey = getEnv('MOOGO_SQL_KEY');
|
|
651
703
|
if (projectKey) {
|
|
704
|
+
if (!projectId)
|
|
705
|
+
throw new Error('MOOGO_PROJECT_ID is required');
|
|
652
706
|
return new MoogoClient({
|
|
653
707
|
baseUrl,
|
|
654
|
-
projectId
|
|
708
|
+
projectId,
|
|
655
709
|
projectKey,
|
|
656
710
|
});
|
|
657
711
|
}
|
|
658
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
|
+
}
|
|
659
718
|
return new MoogoClient({
|
|
660
719
|
baseUrl,
|
|
661
|
-
projectId
|
|
662
|
-
accessKeyId
|
|
663
|
-
secretKey
|
|
720
|
+
projectId,
|
|
721
|
+
accessKeyId,
|
|
722
|
+
secretKey,
|
|
664
723
|
});
|
|
665
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,7 +64,12 @@ 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}
|
|
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. */
|
|
68
73
|
s3Download(bucketName: string, key: string, opts?: {
|
|
69
74
|
signal?: AbortSignal;
|
|
70
75
|
}): Promise<Response>;
|
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,9 +275,23 @@ export class MoogoClient {
|
|
|
254
275
|
async deleteBucket(bucketId) {
|
|
255
276
|
await this.requestStorage('DELETE', `${this.getCatalogPath()}/${bucketId}`);
|
|
256
277
|
}
|
|
257
|
-
/** S3-compatible download (R2 wire-compat) via /s3/{bucket}/{key}
|
|
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. */
|
|
258
284
|
async s3Download(bucketName, key, opts) {
|
|
259
|
-
|
|
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 });
|
|
260
295
|
}
|
|
261
296
|
/** Toggle bucket public/private (fans out to all objects) */
|
|
262
297
|
async setBucketPublic(bucketId, isPublic) {
|
|
@@ -501,26 +536,40 @@ export class MoogoClient {
|
|
|
501
536
|
/** Get a presigned URL for an object */
|
|
502
537
|
async getPresignedUrl(key, request, options = {}) {
|
|
503
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.
|
|
504
543
|
const path = `/p/${this.projectId}/bucket/${encodeURIComponent(key)}/sign`;
|
|
505
|
-
const
|
|
544
|
+
const body = {
|
|
545
|
+
method: request.method,
|
|
546
|
+
expires_in: request.expires_in,
|
|
547
|
+
};
|
|
506
548
|
if (bucket !== 'default')
|
|
507
|
-
|
|
549
|
+
body.bucket = bucket;
|
|
508
550
|
return this.requestStorage('POST', path, {
|
|
509
|
-
|
|
510
|
-
body: JSON.stringify(request),
|
|
551
|
+
body: JSON.stringify(body),
|
|
511
552
|
signal,
|
|
512
553
|
});
|
|
513
554
|
}
|
|
514
555
|
/** Create a signed upload URL (returns upload URL + object metadata) */
|
|
515
556
|
async createSignedUpload(key, request, options = {}) {
|
|
516
557
|
const { bucket = 'default', signal } = options;
|
|
517
|
-
|
|
518
|
-
|
|
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
|
+
};
|
|
519
567
|
if (bucket !== 'default')
|
|
520
|
-
|
|
568
|
+
body.bucket = bucket;
|
|
569
|
+
if (request.content_type)
|
|
570
|
+
body.content_type = request.content_type;
|
|
521
571
|
return this.requestStorage('POST', path, {
|
|
522
|
-
|
|
523
|
-
body: JSON.stringify(request),
|
|
572
|
+
body: JSON.stringify(body),
|
|
524
573
|
signal,
|
|
525
574
|
});
|
|
526
575
|
}
|
|
@@ -636,23 +685,33 @@ export function createSQLClient(config) {
|
|
|
636
685
|
/** Convenience function to create a client from environment variables */
|
|
637
686
|
export function createClientFromEnv(env) {
|
|
638
687
|
const getEnv = (key) => env?.[key] ?? process.env[key];
|
|
639
|
-
// Standard env vars only (no legacy fallbacks)
|
|
640
688
|
const rawBase = getEnv('MOOGO_BASE_URL') || 'https://api.moogo.dev';
|
|
641
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
|
+
}
|
|
642
694
|
// SQL key
|
|
643
695
|
const projectKey = getEnv('MOOGO_SQL_KEY');
|
|
644
696
|
if (projectKey) {
|
|
697
|
+
if (!projectId)
|
|
698
|
+
throw new Error('MOOGO_PROJECT_ID is required');
|
|
645
699
|
return new MoogoClient({
|
|
646
700
|
baseUrl,
|
|
647
|
-
projectId
|
|
701
|
+
projectId,
|
|
648
702
|
projectKey,
|
|
649
703
|
});
|
|
650
704
|
}
|
|
651
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
|
+
}
|
|
652
711
|
return new MoogoClient({
|
|
653
712
|
baseUrl,
|
|
654
|
-
projectId
|
|
655
|
-
accessKeyId
|
|
656
|
-
secretKey
|
|
713
|
+
projectId,
|
|
714
|
+
accessKeyId,
|
|
715
|
+
secretKey,
|
|
657
716
|
});
|
|
658
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,9 +374,23 @@ export class MoogoClient {
|
|
|
348
374
|
await this.requestStorage<DeleteResponse>('DELETE', `${this.getCatalogPath()}/${bucketId}`);
|
|
349
375
|
}
|
|
350
376
|
|
|
351
|
-
/** S3-compatible download (R2 wire-compat) via /s3/{bucket}/{key}
|
|
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. */
|
|
352
383
|
async s3Download(bucketName: string, key: string, opts?: { signal?: AbortSignal }): Promise<Response> {
|
|
353
|
-
|
|
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 });
|
|
354
394
|
}
|
|
355
395
|
|
|
356
396
|
/** Toggle bucket public/private (fans out to all objects) */
|
|
@@ -651,13 +691,19 @@ export class MoogoClient {
|
|
|
651
691
|
): Promise<PresignedUrlResponse> {
|
|
652
692
|
const { bucket = 'default', signal } = options;
|
|
653
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.
|
|
654
698
|
const path = `/p/${this.projectId}/bucket/${encodeURIComponent(key)}/sign`;
|
|
655
|
-
const
|
|
656
|
-
|
|
699
|
+
const body: Record<string, any> = {
|
|
700
|
+
method: request.method,
|
|
701
|
+
expires_in: request.expires_in,
|
|
702
|
+
};
|
|
703
|
+
if (bucket !== 'default') body.bucket = bucket;
|
|
657
704
|
|
|
658
705
|
return this.requestStorage<PresignedUrlResponse>('POST', path, {
|
|
659
|
-
|
|
660
|
-
body: JSON.stringify(request),
|
|
706
|
+
body: JSON.stringify(body),
|
|
661
707
|
signal,
|
|
662
708
|
});
|
|
663
709
|
}
|
|
@@ -670,13 +716,20 @@ export class MoogoClient {
|
|
|
670
716
|
): Promise<SignedUploadResponse> {
|
|
671
717
|
const { bucket = 'default', signal } = options;
|
|
672
718
|
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
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;
|
|
676
730
|
|
|
677
731
|
return this.requestStorage<SignedUploadResponse>('POST', path, {
|
|
678
|
-
|
|
679
|
-
body: JSON.stringify(request),
|
|
732
|
+
body: JSON.stringify(body),
|
|
680
733
|
signal,
|
|
681
734
|
});
|
|
682
735
|
}
|
|
@@ -850,24 +903,34 @@ export function createSQLClient(config: {
|
|
|
850
903
|
export function createClientFromEnv(env?: Record<string, string | undefined>): MoogoClient {
|
|
851
904
|
const getEnv = (key: string) => env?.[key] ?? process.env[key];
|
|
852
905
|
|
|
853
|
-
// Standard env vars only (no legacy fallbacks)
|
|
854
906
|
const rawBase = getEnv('MOOGO_BASE_URL') || 'https://api.moogo.dev';
|
|
855
907
|
const baseUrl = rawBase.replace(/\/p\/[^/]+\/bucket.*$/, '').replace(/\/+$/, '');
|
|
856
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
|
+
|
|
857
914
|
// SQL key
|
|
858
915
|
const projectKey = getEnv('MOOGO_SQL_KEY');
|
|
859
916
|
if (projectKey) {
|
|
917
|
+
if (!projectId) throw new Error('MOOGO_PROJECT_ID is required');
|
|
860
918
|
return new MoogoClient({
|
|
861
919
|
baseUrl,
|
|
862
|
-
projectId
|
|
920
|
+
projectId,
|
|
863
921
|
projectKey,
|
|
864
922
|
});
|
|
865
923
|
}
|
|
866
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
|
+
}
|
|
867
930
|
return new MoogoClient({
|
|
868
931
|
baseUrl,
|
|
869
|
-
projectId
|
|
870
|
-
accessKeyId
|
|
871
|
-
secretKey
|
|
932
|
+
projectId,
|
|
933
|
+
accessKeyId,
|
|
934
|
+
secretKey,
|
|
872
935
|
});
|
|
873
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;
|