@kmlckj/licos-platform-sdk 0.6.3 → 0.6.5

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/src/index.d.ts CHANGED
@@ -1,208 +1,251 @@
1
- export class PlatformSdkError extends Error {
2
- status?: number;
3
- code?: number;
4
- details?: unknown;
5
- }
6
-
7
- export class ConfigurationError extends PlatformSdkError {}
8
- export class ApiError extends PlatformSdkError {}
9
-
10
- export interface DatabaseFilter {
11
- field: string;
12
- op: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'not_in' | 'is_null' | 'is_not_null' | 'like' | 'ilike' | string;
13
- value?: unknown;
14
- }
15
-
16
- export interface DatabaseOrderBy {
17
- field: string;
18
- direction?: 'asc' | 'desc';
19
- }
20
-
21
- export interface DatabaseRange {
22
- from: number;
23
- to: number;
24
- }
25
-
26
- export interface DatabaseResponse {
27
- data?: Record<string, unknown>[];
28
- count?: number;
29
- affectedRows?: number;
30
- message?: string;
31
- [key: string]: unknown;
32
- }
33
-
34
- export interface DatabaseQueryOptions {
35
- select?: string | string[];
36
- filters?: DatabaseFilter[];
37
- orderBy?: DatabaseOrderBy[];
38
- range?: DatabaseRange;
39
- limit?: number;
40
- offset?: number;
41
- count?: boolean;
42
- head?: boolean;
43
- }
44
-
45
- export interface DatabaseMutationOptions {
46
- row?: Record<string, unknown>;
47
- rows?: Record<string, unknown>[];
48
- values?: Record<string, unknown>;
49
- filters?: DatabaseFilter[];
50
- updates?: Array<{ filters?: DatabaseFilter[]; values?: Record<string, unknown> }>;
51
- deletes?: Array<{ filters?: DatabaseFilter[] }>;
52
- conflictKeys?: string[];
53
- returning?: boolean;
54
- }
55
-
56
- export interface DatabaseOperation {
57
- type: 'query' | 'insert' | 'update' | 'delete' | 'upsert' | string;
58
- request: Record<string, unknown>;
59
- }
60
-
61
- export interface TableQuery {
62
- select(...fields: string[]): TableQuery;
63
- filter(field: string, op: string, value?: unknown): TableQuery;
64
- eq(field: string, value: unknown): TableQuery;
65
- neq(field: string, value: unknown): TableQuery;
66
- gt(field: string, value: unknown): TableQuery;
67
- gte(field: string, value: unknown): TableQuery;
68
- lt(field: string, value: unknown): TableQuery;
69
- lte(field: string, value: unknown): TableQuery;
70
- in(field: string, value: unknown[]): TableQuery;
71
- notIn(field: string, value: unknown[]): TableQuery;
72
- isNull(field: string): TableQuery;
73
- isNotNull(field: string): TableQuery;
74
- like(field: string, value: string): TableQuery;
75
- ilike(field: string, value: string): TableQuery;
76
- order(field: string, options?: { desc?: boolean }): TableQuery;
77
- range(from: number, to: number): TableQuery;
78
- limit(value: number): TableQuery;
79
- offset(value: number): TableQuery;
80
- withCount(options?: { head?: boolean }): TableQuery;
81
- execute(): Promise<DatabaseResponse>;
82
- single(): Promise<DatabaseResponse>;
83
- maybeSingle(): Promise<DatabaseResponse>;
84
- }
85
-
86
- export function query(table: string, options?: DatabaseQueryOptions): Promise<DatabaseResponse>;
87
- export function single(table: string, options?: DatabaseQueryOptions & { maybe?: boolean }): Promise<DatabaseResponse>;
88
- export function maybeSingle(table: string, options?: DatabaseQueryOptions): Promise<DatabaseResponse>;
89
- export function aggregate(table: string, aggregateName: string, options?: { field?: string; groupBy?: string[]; filters?: DatabaseFilter[] }): Promise<DatabaseResponse>;
90
- export function insert(table: string, options?: DatabaseMutationOptions): Promise<DatabaseResponse>;
91
- export function updateRows(table: string, options?: DatabaseMutationOptions): Promise<DatabaseResponse>;
92
- export function deleteRows(table: string, options?: DatabaseMutationOptions): Promise<DatabaseResponse>;
93
- export function upsert(table: string, options?: DatabaseMutationOptions): Promise<DatabaseResponse>;
94
- export function transaction(operations: DatabaseOperation[]): Promise<DatabaseResponse[]>;
95
- export function rpc(functionName: string, args?: Record<string, unknown>): Promise<DatabaseResponse>;
96
- export function table(name: string): TableQuery;
97
-
98
- export const database: {
99
- query: typeof query;
100
- single: typeof single;
101
- maybeSingle: typeof maybeSingle;
102
- aggregate: typeof aggregate;
103
- insert: typeof insert;
104
- updateRows: typeof updateRows;
105
- deleteRows: typeof deleteRows;
106
- upsert: typeof upsert;
107
- transaction: typeof transaction;
108
- rpc: typeof rpc;
109
- table: typeof table;
110
- };
111
-
112
- export interface StorageSummary {
113
- workspaceId?: string;
114
- projectId?: string;
115
- scope?: string;
116
- bucketName?: string;
117
- usedSizeBytes?: number;
118
- fileCount?: number;
119
- folderCount?: number;
120
- serviceEnabled?: boolean;
121
- [key: string]: unknown;
122
- }
123
-
124
- export interface StorageFolder {
125
- id?: string;
126
- workspaceId?: string;
127
- projectId?: string;
128
- scope?: string;
129
- parentId?: string | null;
130
- folderName?: string;
131
- folderPath?: string;
132
- createdAt?: string;
133
- updatedAt?: string;
134
- [key: string]: unknown;
135
- }
136
-
137
- export interface StorageFile {
138
- id?: string;
139
- workspaceId?: string;
140
- projectId?: string;
141
- scope?: string;
142
- folderId?: string | null;
143
- folderPath?: string;
144
- fileName?: string;
145
- contentType?: string;
146
- sizeBytes?: number;
147
- storageBucket?: string;
148
- storageKey?: string;
149
- downloadUrl?: string;
150
- createdAt?: string;
151
- updatedAt?: string;
152
- [key: string]: unknown;
153
- }
154
-
155
- export interface StorageEntries {
156
- currentFolderId?: string | null;
157
- currentFolderName?: string;
158
- currentFolderPath?: string;
159
- breadcrumbs?: unknown[];
160
- folders?: StorageFolder[];
161
- files?: StorageFile[];
162
- [key: string]: unknown;
163
- }
164
-
165
- export interface UploadFileOptions {
166
- folderId?: string;
167
- fileName?: string;
168
- contentType?: string;
169
- }
170
-
171
- export const MAX_UPLOAD_FILE_BYTES: number;
172
-
173
- export interface ShareUrlOptions {
174
- expirySeconds?: number;
175
- }
176
-
177
- export function summary(): Promise<StorageSummary>;
178
- export function listFolders(): Promise<StorageFolder[]>;
179
- export function listEntries(options?: { folderId?: string }): Promise<StorageEntries>;
180
- export function listFiles(): Promise<StorageFile[]>;
181
- export function createFolder(folderName: string, options?: { parentId?: string }): Promise<StorageFolder>;
182
- export function renameFolder(folderId: string, folderName: string): Promise<StorageFolder>;
183
- export function deleteFolder(folderId: string): Promise<void>;
184
- export function uploadFile(
185
- input: string | Blob | Buffer | Uint8Array,
186
- options?: UploadFileOptions,
187
- ): Promise<StorageFile>;
188
- export function renameFile(fileId: string, fileName: string): Promise<StorageFile>;
189
- export function moveFile(fileId: string, options?: { folderId?: string }): Promise<StorageFile>;
190
- export function shareUrl(fileId: string, options?: ShareUrlOptions): Promise<{ url?: string; expiresAt?: string; [key: string]: unknown }>;
191
- export function objectExists(options?: { fileId?: string; objectKey?: string }): Promise<{ fileId?: string; bucketName?: string; objectKey?: string; exists?: boolean; [key: string]: unknown }>;
192
- export function deleteFile(fileId: string): Promise<void>;
193
-
194
- export const storage: {
195
- summary: typeof summary;
196
- listFolders: typeof listFolders;
197
- listEntries: typeof listEntries;
198
- listFiles: typeof listFiles;
199
- createFolder: typeof createFolder;
200
- renameFolder: typeof renameFolder;
201
- deleteFolder: typeof deleteFolder;
202
- uploadFile: typeof uploadFile;
203
- renameFile: typeof renameFile;
204
- moveFile: typeof moveFile;
205
- shareUrl: typeof shareUrl;
206
- objectExists: typeof objectExists;
207
- deleteFile: typeof deleteFile;
208
- };
1
+ export class PlatformSdkError extends Error {
2
+ status?: number;
3
+ code?: number;
4
+ details?: unknown;
5
+ }
6
+
7
+ export class ConfigurationError extends PlatformSdkError {}
8
+ export class ApiError extends PlatformSdkError {}
9
+
10
+ export interface DatabaseFilter {
11
+ field: string;
12
+ op: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'not_in' | 'is_null' | 'is_not_null' | 'like' | 'ilike' | string;
13
+ value?: unknown;
14
+ }
15
+
16
+ export interface DatabaseOrderBy {
17
+ field: string;
18
+ direction?: 'asc' | 'desc';
19
+ }
20
+
21
+ export interface DatabaseRange {
22
+ from: number;
23
+ to: number;
24
+ }
25
+
26
+ export interface DatabaseResponse {
27
+ data?: Record<string, unknown>[];
28
+ count?: number;
29
+ affectedRows?: number;
30
+ message?: string;
31
+ [key: string]: unknown;
32
+ }
33
+
34
+ export interface DatabaseQueryOptions {
35
+ select?: string | string[];
36
+ filters?: DatabaseFilter[];
37
+ orderBy?: DatabaseOrderBy[];
38
+ range?: DatabaseRange;
39
+ limit?: number;
40
+ offset?: number;
41
+ count?: boolean;
42
+ head?: boolean;
43
+ }
44
+
45
+ export interface DatabaseMutationOptions {
46
+ row?: Record<string, unknown>;
47
+ rows?: Record<string, unknown>[];
48
+ values?: Record<string, unknown>;
49
+ filters?: DatabaseFilter[];
50
+ updates?: Array<{ filters?: DatabaseFilter[]; values?: Record<string, unknown> }>;
51
+ deletes?: Array<{ filters?: DatabaseFilter[] }>;
52
+ conflictKeys?: string[];
53
+ returning?: boolean;
54
+ }
55
+
56
+ export interface DatabaseOperation {
57
+ type: 'query' | 'insert' | 'update' | 'delete' | 'upsert' | string;
58
+ request: Record<string, unknown>;
59
+ }
60
+
61
+ export interface DatabaseSchemaColumn {
62
+ name: string;
63
+ type?: string;
64
+ nullable?: boolean;
65
+ primaryKey?: boolean;
66
+ defaultValue?: string | null;
67
+ [key: string]: unknown;
68
+ }
69
+
70
+ export interface DatabaseSchemaTable {
71
+ schema?: string;
72
+ name: string;
73
+ description?: string | null;
74
+ columns?: DatabaseSchemaColumn[];
75
+ indexes?: unknown[];
76
+ foreignKeys?: unknown[];
77
+ constraints?: unknown[];
78
+ [key: string]: unknown;
79
+ }
80
+
81
+ export interface DatabaseSchema {
82
+ databaseId?: string;
83
+ environment?: 'dev' | 'prod' | string;
84
+ tables?: DatabaseSchemaTable[];
85
+ views?: unknown[];
86
+ functions?: unknown[];
87
+ enums?: unknown[];
88
+ [key: string]: unknown;
89
+ }
90
+
91
+ export interface GenerateOrmOptions {
92
+ language: 'typescript' | 'python' | 'ts' | 'py' | string;
93
+ orm?: 'drizzle' | 'sqlalchemy' | string;
94
+ }
95
+
96
+ export interface TableQuery {
97
+ select(...fields: string[]): TableQuery;
98
+ filter(field: string, op: string, value?: unknown): TableQuery;
99
+ eq(field: string, value: unknown): TableQuery;
100
+ neq(field: string, value: unknown): TableQuery;
101
+ gt(field: string, value: unknown): TableQuery;
102
+ gte(field: string, value: unknown): TableQuery;
103
+ lt(field: string, value: unknown): TableQuery;
104
+ lte(field: string, value: unknown): TableQuery;
105
+ in(field: string, value: unknown[]): TableQuery;
106
+ notIn(field: string, value: unknown[]): TableQuery;
107
+ isNull(field: string): TableQuery;
108
+ isNotNull(field: string): TableQuery;
109
+ like(field: string, value: string): TableQuery;
110
+ ilike(field: string, value: string): TableQuery;
111
+ order(field: string, options?: { desc?: boolean }): TableQuery;
112
+ range(from: number, to: number): TableQuery;
113
+ limit(value: number): TableQuery;
114
+ offset(value: number): TableQuery;
115
+ withCount(options?: { head?: boolean }): TableQuery;
116
+ execute(): Promise<DatabaseResponse>;
117
+ single(): Promise<DatabaseResponse>;
118
+ maybeSingle(): Promise<DatabaseResponse>;
119
+ }
120
+
121
+ export function query(table: string, options?: DatabaseQueryOptions): Promise<DatabaseResponse>;
122
+ export function single(table: string, options?: DatabaseQueryOptions & { maybe?: boolean }): Promise<DatabaseResponse>;
123
+ export function maybeSingle(table: string, options?: DatabaseQueryOptions): Promise<DatabaseResponse>;
124
+ export function aggregate(table: string, aggregateName: string, options?: { field?: string; groupBy?: string[]; filters?: DatabaseFilter[] }): Promise<DatabaseResponse>;
125
+ export function insert(table: string, options?: DatabaseMutationOptions): Promise<DatabaseResponse>;
126
+ export function updateRows(table: string, options?: DatabaseMutationOptions): Promise<DatabaseResponse>;
127
+ export function deleteRows(table: string, options?: DatabaseMutationOptions): Promise<DatabaseResponse>;
128
+ export function upsert(table: string, options?: DatabaseMutationOptions): Promise<DatabaseResponse>;
129
+ export function transaction(operations: DatabaseOperation[]): Promise<DatabaseResponse[]>;
130
+ export function rpc(functionName: string, args?: Record<string, unknown>): Promise<DatabaseResponse>;
131
+ export function getSchema(): Promise<DatabaseSchema>;
132
+ export function defaultOrm(language: string): string;
133
+ export function generateOrm(schemaPayload: DatabaseSchema, options: GenerateOrmOptions): string;
134
+ export function exportOrm(options: GenerateOrmOptions): Promise<string>;
135
+ export function table(name: string): TableQuery;
136
+
137
+ export const database: {
138
+ query: typeof query;
139
+ single: typeof single;
140
+ maybeSingle: typeof maybeSingle;
141
+ aggregate: typeof aggregate;
142
+ insert: typeof insert;
143
+ updateRows: typeof updateRows;
144
+ deleteRows: typeof deleteRows;
145
+ upsert: typeof upsert;
146
+ transaction: typeof transaction;
147
+ rpc: typeof rpc;
148
+ getSchema: typeof getSchema;
149
+ defaultOrm: typeof defaultOrm;
150
+ generateOrm: typeof generateOrm;
151
+ exportOrm: typeof exportOrm;
152
+ table: typeof table;
153
+ };
154
+
155
+ export interface StorageSummary {
156
+ workspaceId?: string;
157
+ projectId?: string;
158
+ scope?: string;
159
+ bucketName?: string;
160
+ usedSizeBytes?: number;
161
+ fileCount?: number;
162
+ folderCount?: number;
163
+ serviceEnabled?: boolean;
164
+ [key: string]: unknown;
165
+ }
166
+
167
+ export interface StorageFolder {
168
+ id?: string;
169
+ workspaceId?: string;
170
+ projectId?: string;
171
+ scope?: string;
172
+ parentId?: string | null;
173
+ folderName?: string;
174
+ folderPath?: string;
175
+ createdAt?: string;
176
+ updatedAt?: string;
177
+ [key: string]: unknown;
178
+ }
179
+
180
+ export interface StorageFile {
181
+ id?: string;
182
+ workspaceId?: string;
183
+ projectId?: string;
184
+ scope?: string;
185
+ folderId?: string | null;
186
+ folderPath?: string;
187
+ fileName?: string;
188
+ contentType?: string;
189
+ sizeBytes?: number;
190
+ storageBucket?: string;
191
+ storageKey?: string;
192
+ downloadUrl?: string;
193
+ createdAt?: string;
194
+ updatedAt?: string;
195
+ [key: string]: unknown;
196
+ }
197
+
198
+ export interface StorageEntries {
199
+ currentFolderId?: string | null;
200
+ currentFolderName?: string;
201
+ currentFolderPath?: string;
202
+ breadcrumbs?: unknown[];
203
+ folders?: StorageFolder[];
204
+ files?: StorageFile[];
205
+ [key: string]: unknown;
206
+ }
207
+
208
+ export interface UploadFileOptions {
209
+ folderId?: string;
210
+ fileName?: string;
211
+ contentType?: string;
212
+ }
213
+
214
+ export const MAX_UPLOAD_FILE_BYTES: number;
215
+
216
+ export interface ShareUrlOptions {
217
+ expirySeconds?: number;
218
+ }
219
+
220
+ export function summary(): Promise<StorageSummary>;
221
+ export function listFolders(): Promise<StorageFolder[]>;
222
+ export function listEntries(options?: { folderId?: string }): Promise<StorageEntries>;
223
+ export function listFiles(): Promise<StorageFile[]>;
224
+ export function createFolder(folderName: string, options?: { parentId?: string }): Promise<StorageFolder>;
225
+ export function renameFolder(folderId: string, folderName: string): Promise<StorageFolder>;
226
+ export function deleteFolder(folderId: string): Promise<void>;
227
+ export function uploadFile(
228
+ input: string | Blob | Buffer | Uint8Array,
229
+ options?: UploadFileOptions,
230
+ ): Promise<StorageFile>;
231
+ export function renameFile(fileId: string, fileName: string): Promise<StorageFile>;
232
+ export function moveFile(fileId: string, options?: { folderId?: string }): Promise<StorageFile>;
233
+ export function shareUrl(fileId: string, options?: ShareUrlOptions): Promise<{ url?: string; expiresAt?: string; [key: string]: unknown }>;
234
+ export function objectExists(options?: { fileId?: string; objectKey?: string }): Promise<{ fileId?: string; bucketName?: string; objectKey?: string; exists?: boolean; [key: string]: unknown }>;
235
+ export function deleteFile(fileId: string): Promise<void>;
236
+
237
+ export const storage: {
238
+ summary: typeof summary;
239
+ listFolders: typeof listFolders;
240
+ listEntries: typeof listEntries;
241
+ listFiles: typeof listFiles;
242
+ createFolder: typeof createFolder;
243
+ renameFolder: typeof renameFolder;
244
+ deleteFolder: typeof deleteFolder;
245
+ uploadFile: typeof uploadFile;
246
+ renameFile: typeof renameFile;
247
+ moveFile: typeof moveFile;
248
+ shareUrl: typeof shareUrl;
249
+ objectExists: typeof objectExists;
250
+ deleteFile: typeof deleteFile;
251
+ };
package/src/runtime.js CHANGED
@@ -1,5 +1,8 @@
1
1
  import { ConfigurationError } from './shared.js';
2
2
 
3
+ const AI_USER_TOKEN_PATH = '/api/v1/internal/auth/ai-user-token';
4
+ const tokenCache = new Map();
5
+
3
6
  export function env(name) {
4
7
  const value = process.env[name];
5
8
  if (typeof value !== 'string') return undefined;
@@ -40,22 +43,93 @@ export function projectEnvironment(overrideEnvName) {
40
43
  return ['prod', 'production', 'release'].includes(projectEnv) ? 'prod' : 'dev';
41
44
  }
42
45
 
43
- export function runtimeConfig({ environmentOverrideEnv } = {}) {
46
+ function decodeAiTokenPayload(payload) {
47
+ if (!payload || typeof payload !== 'object') {
48
+ throw new ConfigurationError('AI user token exchange response is not an object');
49
+ }
50
+ if ((payload.code !== undefined && payload.code !== 0) || payload.success === false) {
51
+ const error = new ConfigurationError(payload.message || 'AI user token exchange failed');
52
+ error.code = typeof payload.code === 'number' ? payload.code : undefined;
53
+ error.details = payload;
54
+ throw error;
55
+ }
56
+ const data = payload.data;
57
+ const token =
58
+ typeof data === 'string'
59
+ ? data.trim()
60
+ : String(data?.accessToken || data?.access_token || data?.token || '').trim();
61
+ if (!token) {
62
+ const error = new ConfigurationError('AI user token exchange response missing accessToken');
63
+ error.details = payload;
64
+ throw error;
65
+ }
66
+ return token;
67
+ }
68
+
69
+ async function resolveUserToken(baseUrl, userId) {
70
+ const ownerUserId = String(userId || '').trim();
71
+ if (!ownerUserId) {
72
+ throw new ConfigurationError('project owner user ID is not configured');
73
+ }
74
+ const aiAgentToken = env('LICOS_AI_AGENT_TOKEN');
75
+ if (!aiAgentToken) {
76
+ throw new ConfigurationError('platform runtime identity is unavailable');
77
+ }
78
+
79
+ const cacheKey = `${baseUrl}\n${ownerUserId}\n${aiAgentToken}`;
80
+ if (tokenCache.has(cacheKey)) return tokenCache.get(cacheKey);
81
+
82
+ const promise = fetch(`${baseUrl}${AI_USER_TOKEN_PATH}`, {
83
+ method: 'POST',
84
+ headers: {
85
+ Authorization: `Bearer ${aiAgentToken}`,
86
+ 'Content-Type': 'application/json',
87
+ },
88
+ body: JSON.stringify({ userId: ownerUserId }),
89
+ }).then(async (response) => {
90
+ const text = await response.text();
91
+ let payload = null;
92
+ try {
93
+ payload = text ? JSON.parse(text) : null;
94
+ } catch (error) {
95
+ const wrapped = new ConfigurationError('parse AI user token exchange response failed');
96
+ wrapped.status = response.status;
97
+ wrapped.details = text;
98
+ throw wrapped;
99
+ }
100
+ if (!response.ok) {
101
+ const message = payload?.message || text || `AI user token exchange returned ${response.status}`;
102
+ const wrapped = new ConfigurationError(message);
103
+ wrapped.status = response.status;
104
+ wrapped.details = payload;
105
+ throw wrapped;
106
+ }
107
+ return decodeAiTokenPayload(payload);
108
+ });
109
+ tokenCache.set(cacheKey, promise);
110
+ try {
111
+ return await promise;
112
+ } catch (error) {
113
+ tokenCache.delete(cacheKey);
114
+ throw error;
115
+ }
116
+ }
117
+
118
+ export async function runtimeConfig({ environmentOverrideEnv } = {}) {
44
119
  const projectId = env('LICOS_PROJECT_ID') || env('AGENT_PROJECT_ID');
45
120
  if (!projectId) {
46
121
  throw new ConfigurationError('LICOS_PROJECT_ID or AGENT_PROJECT_ID is not configured');
47
122
  }
48
- const token = env('LICOS_RUNTIME_TOKEN') || env('LICOS_USER_TOKEN');
49
- if (!token) {
50
- throw new ConfigurationError('LICOS_RUNTIME_TOKEN or LICOS_USER_TOKEN is not configured');
51
- }
123
+ const baseUrl = platformBaseUrl();
124
+ const userId = env('LICOS_USER_ID') || env('AGENT_USER_ID');
125
+ const token = await resolveUserToken(baseUrl, userId);
52
126
  return {
53
- baseUrl: platformBaseUrl(),
127
+ baseUrl,
54
128
  projectId,
55
129
  environment: projectEnvironment(environmentOverrideEnv),
56
130
  token,
57
131
  workspaceId: env('LICOS_WORKSPACE_ID') || env('AGENT_WORKSPACE_ID'),
58
- userId: env('LICOS_USER_ID') || env('AGENT_USER_ID'),
132
+ userId,
59
133
  };
60
134
  }
61
135
 
package/src/storage.js CHANGED
@@ -6,7 +6,7 @@ import { authHeaders, runtimeConfig } from './runtime.js';
6
6
 
7
7
  export const MAX_UPLOAD_FILE_BYTES = 20 * 1024 * 1024;
8
8
 
9
- function storageConfig() {
9
+ async function storageConfig() {
10
10
  return runtimeConfig({ environmentOverrideEnv: 'LICOS_STORAGE_SCOPE' });
11
11
  }
12
12
 
@@ -45,7 +45,7 @@ async function decodeResponse(response) {
45
45
  }
46
46
 
47
47
  async function requestJson(method, route, { params, body } = {}) {
48
- const config = storageConfig();
48
+ const config = await storageConfig();
49
49
  const response = await fetch(storageUrl(config, route, params), {
50
50
  method,
51
51
  headers: authHeaders(config),
@@ -113,8 +113,8 @@ export async function deleteFolder(folderId) {
113
113
  }
114
114
 
115
115
  export async function uploadFile(input, options = {}) {
116
- const config = storageConfig();
117
116
  const { blob, fileName } = await filePart(input, options);
117
+ const config = await storageConfig();
118
118
  const form = new FormData();
119
119
  form.set('projectId', config.projectId);
120
120
  form.set('scope', config.environment);