@critical-path/core 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @critical-path/core
2
2
 
3
+ ## 0.8.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 315425c: fix(core): generate Firebase Storage download tokens and construct valid public URLs
8
+
3
9
  ## 0.8.0
4
10
 
5
11
  ### Minor Changes
@@ -25,6 +25,7 @@ export declare class InMemoryFirebaseStorageMock implements FirebaseStorageBucke
25
25
  file(path: string): {
26
26
  save(data: Uint8Array | Buffer | string, options?: any): Promise<void>;
27
27
  delete(): Promise<void>;
28
+ getMetadata(): Promise<[any]>;
28
29
  getSignedUrl(config: any): Promise<[string]>;
29
30
  publicUrl(): string;
30
31
  };
@@ -1 +1 @@
1
- {"version":3,"file":"firebase-storage.d.ts","sourceRoot":"","sources":["../../src/storage/firebase-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,8BAA8B;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG;QAClB,IAAI,CACF,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,EAClC,OAAO,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE;gBAAE,WAAW,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;aAAE,CAAC;YAAC,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE,GACzF,OAAO,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,YAAY,CAAC,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;YAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9H,SAAS,CAAC,IAAI,MAAM,CAAC;KACtB,CAAC;CACH;AAED,qBAAa,2BAA4B,YAAW,8BAA8B;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,KAAK,CAAgE;gBAEjE,IAAI,GAAE,MAA+B;IAIjD,IAAI,CAAC,IAAI,EAAE,MAAM;mBAII,UAAU,GAAG,MAAM,GAAG,MAAM,YAAY,GAAG;;6BAmBjC,GAAG,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;;;CAQvD;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,8BAA8B,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,MAAM,GAAE,qBAA0B;IAS9C,OAAO,CAAC,YAAY;IAWd,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwCzD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5C,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInD,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CA6B1F"}
1
+ {"version":3,"file":"firebase-storage.d.ts","sourceRoot":"","sources":["../../src/storage/firebase-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,8BAA8B;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG;QAClB,IAAI,CACF,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,EAClC,OAAO,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE;gBAAE,WAAW,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;aAAE,CAAC;YAAC,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE,GACzF,OAAO,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,YAAY,CAAC,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;YAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9H,SAAS,CAAC,IAAI,MAAM,CAAC;KACtB,CAAC;CACH;AAED,qBAAa,2BAA4B,YAAW,8BAA8B;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,KAAK,CAAgF;gBAEjF,IAAI,GAAE,MAA+B;IAIjD,IAAI,CAAC,IAAI,EAAE,MAAM;mBAII,UAAU,GAAG,MAAM,GAAG,MAAM,YAAY,GAAG;;uBAoBvC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;6BASR,GAAG,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;;;CAUvD;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,8BAA8B,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,MAAM,GAAE,qBAA0B;IAS9C,OAAO,CAAC,YAAY;IAQd,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+CzD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5C,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcnD,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CA6B1F"}
@@ -24,14 +24,26 @@ export class InMemoryFirebaseStorageMock {
24
24
  }
25
25
  files.set(path, {
26
26
  data: bytes,
27
- contentType: options?.metadata?.contentType || 'application/octet-stream'
27
+ contentType: options?.metadata?.contentType || 'application/octet-stream',
28
+ token: options?.metadata?.metadata?.firebaseStorageDownloadTokens
28
29
  });
29
30
  },
30
31
  async delete() {
31
32
  files.delete(path);
32
33
  },
34
+ async getMetadata() {
35
+ const file = files.get(path);
36
+ return [{
37
+ contentType: file?.contentType,
38
+ metadata: {
39
+ firebaseStorageDownloadTokens: file?.token
40
+ }
41
+ }];
42
+ },
33
43
  async getSignedUrl(config) {
34
- return [`https://firebasestorage.googleapis.com/v0/b/${encodeURIComponent(bucketName)}/o/${encodeURIComponent(path)}?alt=media&token=mock-signed-token`];
44
+ const file = files.get(path);
45
+ const token = file?.token || 'mock-signed-token';
46
+ return [`https://firebasestorage.googleapis.com/v0/b/${encodeURIComponent(bucketName)}/o/${encodeURIComponent(path)}?alt=media&token=${token}`];
35
47
  },
36
48
  publicUrl() {
37
49
  return `https://firebasestorage.googleapis.com/v0/b/${encodeURIComponent(bucketName)}/o/${encodeURIComponent(path)}?alt=media`;
@@ -51,15 +63,12 @@ export class FirebaseStorageAdapter {
51
63
  }
52
64
  this.publicUrlBase = config.publicUrlBase?.replace(/\/+$/, '');
53
65
  }
54
- getPublicUrl(storageKey) {
66
+ getPublicUrl(storageKey, token) {
55
67
  if (this.publicUrlBase) {
56
68
  return `${this.publicUrlBase}/${encodeURIComponent(storageKey).replace(/%2F/g, '/')}`;
57
69
  }
58
- const fileRef = this.bucket.file(storageKey);
59
- if (typeof fileRef.publicUrl === 'function') {
60
- return fileRef.publicUrl();
61
- }
62
- return `https://firebasestorage.googleapis.com/v0/b/${encodeURIComponent(this.bucketName)}/o/${encodeURIComponent(storageKey)}?alt=media`;
70
+ const tokenParam = token ? `&token=${encodeURIComponent(token)}` : '';
71
+ return `https://firebasestorage.googleapis.com/v0/b/${encodeURIComponent(this.bucketName)}/o/${encodeURIComponent(storageKey)}?alt=media${tokenParam}`;
63
72
  }
64
73
  async upload(input) {
65
74
  const prefix = input.pathPrefix ? `${input.pathPrefix.replace(/\/+$/, '')}/` : '';
@@ -84,14 +93,20 @@ export class FirebaseStorageAdapter {
84
93
  }
85
94
  const mimeType = input.mimeType || 'application/octet-stream';
86
95
  const sizeBytes = bodyData.byteLength;
96
+ const downloadToken = typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'
97
+ ? crypto.randomUUID()
98
+ : Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
87
99
  const fileRef = this.bucket.file(storageKey);
88
100
  await fileRef.save(bodyData, {
89
101
  metadata: {
90
- contentType: mimeType
102
+ contentType: mimeType,
103
+ metadata: {
104
+ firebaseStorageDownloadTokens: downloadToken
105
+ }
91
106
  },
92
107
  resumable: false
93
108
  });
94
- const url = this.getPublicUrl(storageKey);
109
+ const url = this.getPublicUrl(storageKey, downloadToken);
95
110
  return {
96
111
  storageKey,
97
112
  url,
@@ -110,6 +125,17 @@ export class FirebaseStorageAdapter {
110
125
  }
111
126
  }
112
127
  async getDownloadUrl(storageKey) {
128
+ const fileRef = this.bucket.file(storageKey);
129
+ if (typeof fileRef.getMetadata === 'function') {
130
+ try {
131
+ const [meta] = await fileRef.getMetadata();
132
+ const token = meta?.metadata?.firebaseStorageDownloadTokens;
133
+ return this.getPublicUrl(storageKey, token);
134
+ }
135
+ catch {
136
+ // Fallback to public URL without token
137
+ }
138
+ }
113
139
  return this.getPublicUrl(storageKey);
114
140
  }
115
141
  async getPresignedUploadUrl(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"firebase-storage.js","sourceRoot":"","sources":["../../src/storage/firebase-storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"firebase-storage.js","sourceRoot":"","sources":["../../src/storage/firebase-storage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@critical-path/core",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Core headless domain engine, plugin architecture, and data stores for Critical Path",
5
5
  "author": "Jack James",
6
6
  "license": "MIT",
@@ -21,7 +21,7 @@ export interface FirebaseStorageBucketInterface {
21
21
 
22
22
  export class InMemoryFirebaseStorageMock implements FirebaseStorageBucketInterface {
23
23
  name: string;
24
- private files = new Map<string, { data: Uint8Array; contentType: string }>();
24
+ private files = new Map<string, { data: Uint8Array; contentType: string; token?: string }>();
25
25
 
26
26
  constructor(name: string = 'mock-firebase-bucket') {
27
27
  this.name = name;
@@ -44,14 +44,26 @@ export class InMemoryFirebaseStorageMock implements FirebaseStorageBucketInterfa
44
44
  }
45
45
  files.set(path, {
46
46
  data: bytes,
47
- contentType: options?.metadata?.contentType || 'application/octet-stream'
47
+ contentType: options?.metadata?.contentType || 'application/octet-stream',
48
+ token: options?.metadata?.metadata?.firebaseStorageDownloadTokens
48
49
  });
49
50
  },
50
51
  async delete() {
51
52
  files.delete(path);
52
53
  },
54
+ async getMetadata(): Promise<[any]> {
55
+ const file = files.get(path);
56
+ return [{
57
+ contentType: file?.contentType,
58
+ metadata: {
59
+ firebaseStorageDownloadTokens: file?.token
60
+ }
61
+ }];
62
+ },
53
63
  async getSignedUrl(config: any): Promise<[string]> {
54
- return [`https://firebasestorage.googleapis.com/v0/b/${encodeURIComponent(bucketName)}/o/${encodeURIComponent(path)}?alt=media&token=mock-signed-token`];
64
+ const file = files.get(path);
65
+ const token = file?.token || 'mock-signed-token';
66
+ return [`https://firebasestorage.googleapis.com/v0/b/${encodeURIComponent(bucketName)}/o/${encodeURIComponent(path)}?alt=media&token=${token}`];
55
67
  },
56
68
  publicUrl() {
57
69
  return `https://firebasestorage.googleapis.com/v0/b/${encodeURIComponent(bucketName)}/o/${encodeURIComponent(path)}?alt=media`;
@@ -80,15 +92,12 @@ export class FirebaseStorageAdapter implements FileStorageAdapter {
80
92
  this.publicUrlBase = config.publicUrlBase?.replace(/\/+$/, '');
81
93
  }
82
94
 
83
- private getPublicUrl(storageKey: string): string {
95
+ private getPublicUrl(storageKey: string, token?: string): string {
84
96
  if (this.publicUrlBase) {
85
97
  return `${this.publicUrlBase}/${encodeURIComponent(storageKey).replace(/%2F/g, '/')}`;
86
98
  }
87
- const fileRef = this.bucket.file(storageKey);
88
- if (typeof fileRef.publicUrl === 'function') {
89
- return fileRef.publicUrl();
90
- }
91
- return `https://firebasestorage.googleapis.com/v0/b/${encodeURIComponent(this.bucketName)}/o/${encodeURIComponent(storageKey)}?alt=media`;
99
+ const tokenParam = token ? `&token=${encodeURIComponent(token)}` : '';
100
+ return `https://firebasestorage.googleapis.com/v0/b/${encodeURIComponent(this.bucketName)}/o/${encodeURIComponent(storageKey)}?alt=media${tokenParam}`;
92
101
  }
93
102
 
94
103
  async upload(input: UploadFileInput): Promise<UploadFileResult> {
@@ -112,16 +121,23 @@ export class FirebaseStorageAdapter implements FileStorageAdapter {
112
121
 
113
122
  const mimeType = input.mimeType || 'application/octet-stream';
114
123
  const sizeBytes = bodyData.byteLength;
124
+ const downloadToken =
125
+ typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'
126
+ ? crypto.randomUUID()
127
+ : Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
115
128
 
116
129
  const fileRef = this.bucket.file(storageKey);
117
130
  await fileRef.save(bodyData, {
118
131
  metadata: {
119
- contentType: mimeType
132
+ contentType: mimeType,
133
+ metadata: {
134
+ firebaseStorageDownloadTokens: downloadToken
135
+ }
120
136
  },
121
137
  resumable: false
122
138
  });
123
139
 
124
- const url = this.getPublicUrl(storageKey);
140
+ const url = this.getPublicUrl(storageKey, downloadToken);
125
141
 
126
142
  return {
127
143
  storageKey,
@@ -142,6 +158,16 @@ export class FirebaseStorageAdapter implements FileStorageAdapter {
142
158
  }
143
159
 
144
160
  async getDownloadUrl(storageKey: string): Promise<string> {
161
+ const fileRef = this.bucket.file(storageKey);
162
+ if (typeof (fileRef as any).getMetadata === 'function') {
163
+ try {
164
+ const [meta] = await (fileRef as any).getMetadata();
165
+ const token = meta?.metadata?.firebaseStorageDownloadTokens;
166
+ return this.getPublicUrl(storageKey, token);
167
+ } catch {
168
+ // Fallback to public URL without token
169
+ }
170
+ }
145
171
  return this.getPublicUrl(storageKey);
146
172
  }
147
173