@newgameplusinc/odyssey-asset-manager-sdk 1.0.0

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/README.md ADDED
@@ -0,0 +1,370 @@
1
+ # odyssey-asset-manager-sdk
2
+
3
+ Official SDK for the Odyssey Asset Manager backend. Provides a fully typed HTTP client for all asset management, upload, and version operations.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install odyssey-asset-manager-sdk
9
+ ```
10
+
11
+ ## Setup
12
+
13
+ ```typescript
14
+ import { AssetManagerSDK } from "odyssey-asset-manager-sdk";
15
+
16
+ const sdk = new AssetManagerSDK({
17
+ baseUrl: "https://your-backend.com/api/v1",
18
+ timeout: 30000, // optional, default 30000ms
19
+ });
20
+ ```
21
+
22
+ ---
23
+
24
+ ## API Reference
25
+
26
+ ### Health
27
+
28
+ #### `sdk.getHealth()`
29
+
30
+ Check if the service is healthy.
31
+
32
+ ```typescript
33
+ const health = await sdk.getHealth();
34
+ // { status: 'ok', timestamp: '...' }
35
+ ```
36
+
37
+ #### `sdk.getRedisHealth()`
38
+
39
+ Check Redis connection health.
40
+
41
+ ```typescript
42
+ const redis = await sdk.getRedisHealth();
43
+ // { status: 'ok', latencyMs: 2 }
44
+ ```
45
+
46
+ ---
47
+
48
+ ### Assets
49
+
50
+ #### `sdk.getAllAssets()`
51
+
52
+ Get all assets.
53
+
54
+ ```typescript
55
+ const assets = await sdk.getAllAssets();
56
+ ```
57
+
58
+ #### `sdk.getAsset(assetId)`
59
+
60
+ Get a single asset by ID.
61
+
62
+ ```typescript
63
+ const asset = await sdk.getAsset("asset-id");
64
+ ```
65
+
66
+ #### `sdk.getAssetsByOrg(orgId)`
67
+
68
+ Get all assets for an organization.
69
+
70
+ ```typescript
71
+ const assets = await sdk.getAssetsByOrg("org-id");
72
+ ```
73
+
74
+ #### `sdk.updateAsset(assetId, data)`
75
+
76
+ Update asset fields.
77
+
78
+ ```typescript
79
+ const updated = await sdk.updateAsset("asset-id", { name: "New Name" });
80
+ ```
81
+
82
+ #### `sdk.markAssetAsUploaded(assetId)`
83
+
84
+ Mark asset upload as complete.
85
+
86
+ ```typescript
87
+ await sdk.markAssetAsUploaded("asset-id");
88
+ ```
89
+
90
+ #### `sdk.markAssetAsValidated(assetId)`
91
+
92
+ Mark asset as validated.
93
+
94
+ ```typescript
95
+ await sdk.markAssetAsValidated("asset-id");
96
+ ```
97
+
98
+ #### `sdk.markAssetAsFailed(assetId)`
99
+
100
+ Mark asset as failed.
101
+
102
+ ```typescript
103
+ await sdk.markAssetAsFailed("asset-id");
104
+ ```
105
+
106
+ #### `sdk.deleteAsset(assetId)`
107
+
108
+ Delete an asset.
109
+
110
+ ```typescript
111
+ await sdk.deleteAsset("asset-id");
112
+ ```
113
+
114
+ ---
115
+
116
+ ### Unreal Project Versions
117
+
118
+ #### `sdk.getProjectVersion(versionId)`
119
+
120
+ Get a single project version.
121
+
122
+ ```typescript
123
+ const version = await sdk.getProjectVersion("version-id");
124
+ ```
125
+
126
+ #### `sdk.getVersionsByAsset(assetId)`
127
+
128
+ Get all versions for an asset.
129
+
130
+ ```typescript
131
+ const versions = await sdk.getVersionsByAsset("asset-id");
132
+ ```
133
+
134
+ #### `sdk.updateProjectVersion(versionId, data)`
135
+
136
+ Update a project version.
137
+
138
+ ```typescript
139
+ const updated = await sdk.updateProjectVersion("version-id", {
140
+ state: "upload_complete",
141
+ target: "Shipping",
142
+ });
143
+ ```
144
+
145
+ #### `sdk.deleteProjectVersion(versionId)`
146
+
147
+ Delete a project version by ID.
148
+
149
+ ```typescript
150
+ await sdk.deleteProjectVersion("version-id");
151
+ ```
152
+
153
+ #### `sdk.deleteVersionsByAsset(assetId)`
154
+
155
+ Delete all versions for an asset.
156
+
157
+ ```typescript
158
+ await sdk.deleteVersionsByAsset("asset-id");
159
+ ```
160
+
161
+ ---
162
+
163
+ ### Users
164
+
165
+ #### `sdk.getAllUsers()`
166
+
167
+ Get all users.
168
+
169
+ ```typescript
170
+ const users = await sdk.getAllUsers();
171
+ ```
172
+
173
+ #### `sdk.getUser(userId)`
174
+
175
+ Get a user by ID.
176
+
177
+ ```typescript
178
+ const user = await sdk.getUser("user-id");
179
+ ```
180
+
181
+ #### `sdk.createUser(data)`
182
+
183
+ Create a new user.
184
+
185
+ ```typescript
186
+ const user = await sdk.createUser({ id: "custom-id" });
187
+ ```
188
+
189
+ #### `sdk.updateUser(userId, data)`
190
+
191
+ Update a user.
192
+
193
+ ```typescript
194
+ const user = await sdk.updateUser("user-id", {});
195
+ ```
196
+
197
+ #### `sdk.deleteUser(userId)`
198
+
199
+ Delete a user.
200
+
201
+ ```typescript
202
+ await sdk.deleteUser("user-id");
203
+ ```
204
+
205
+ ---
206
+
207
+ ### Upload
208
+
209
+ #### `sdk.initiateUpload(data)`
210
+
211
+ Start a new multipart upload session. Returns `uploadId` and `objectName` needed for subsequent calls.
212
+
213
+ ```typescript
214
+ const session = await sdk.initiateUpload({
215
+ orgId: "org-id",
216
+ assetType: "UNREAL_PROJECT",
217
+ assetFilename: "MyProject.zip",
218
+ unrealEngineVersion: "5.2.1",
219
+ target: "Development",
220
+ selfPackaged: true,
221
+ volumeRegions: ["ORD1", "LGA1", "LAS1"],
222
+ });
223
+ // { orgId, assetId, assetVersionId, uploadId, objectName }
224
+ ```
225
+
226
+ #### `sdk.batchGetSignedUrls(orgId, assetId, assetVersionId, uploadId, objectName, partNumbers)`
227
+
228
+ Get signed upload URLs for multiple parts in one request. Use this before starting workers — eliminates per-part backend round trips.
229
+
230
+ ```typescript
231
+ const signedUrls = await sdk.batchGetSignedUrls(
232
+ orgId,
233
+ assetId,
234
+ assetVersionId,
235
+ uploadId,
236
+ objectName,
237
+ [1, 2, 3, 4, 5], // part numbers
238
+ );
239
+ // { 1: 'https://...', 2: 'https://...', ... }
240
+ ```
241
+
242
+ #### `sdk.getSignedUrl(orgId, assetId, assetVersionId, uploadId, objectName, partNumber)`
243
+
244
+ Get a signed URL for a single part. Use this for retries when a pre-fetched URL may have expired.
245
+
246
+ ```typescript
247
+ const url = await sdk.getSignedUrl(
248
+ orgId,
249
+ assetId,
250
+ assetVersionId,
251
+ uploadId,
252
+ objectName,
253
+ 1,
254
+ );
255
+ ```
256
+
257
+ #### `sdk.completeUpload(data)`
258
+
259
+ Complete the multipart upload. Assembles all parts on GCS.
260
+
261
+ ```typescript
262
+ await sdk.completeUpload({
263
+ assetType: "UNREAL_PROJECT",
264
+ orgId,
265
+ assetId,
266
+ assetVersionId,
267
+ uploadId,
268
+ objectName,
269
+ parts: [
270
+ { partNumber: 1, etag: "abc123" },
271
+ { partNumber: 2, etag: "def456" },
272
+ ],
273
+ });
274
+ ```
275
+
276
+ #### `sdk.abortUpload(data)`
277
+
278
+ Abort a multipart upload and clean up all parts from GCS.
279
+
280
+ ```typescript
281
+ await sdk.abortUpload({
282
+ assetType: "UNREAL_PROJECT",
283
+ orgId,
284
+ assetId,
285
+ assetVersionId,
286
+ uploadId,
287
+ objectName,
288
+ });
289
+ ```
290
+
291
+ #### `sdk.deleteUploadRecords(data)`
292
+
293
+ Delete all database records for an upload.
294
+
295
+ ```typescript
296
+ await sdk.deleteUploadRecords({
297
+ assetType: "UNREAL_PROJECT",
298
+ orgId,
299
+ assetId,
300
+ assetVersionId,
301
+ uploadId,
302
+ objectName,
303
+ });
304
+ ```
305
+
306
+ ---
307
+
308
+ ### Session Recovery
309
+
310
+ #### `sdk.getUploadSession(filename)`
311
+
312
+ Check backend for an in-progress upload session matching a filename. Returns `null` if not found. Use on file select to enable resume without localStorage.
313
+
314
+ ```typescript
315
+ const session = await sdk.getUploadSession("MyProject.zip");
316
+ if (session) {
317
+ // resume upload
318
+ const parts = await sdk.listUploadedParts(
319
+ session.objectName,
320
+ session.uploadId,
321
+ );
322
+ }
323
+ ```
324
+
325
+ #### `sdk.listUploadedParts(objectName, uploadId)`
326
+
327
+ List parts already uploaded to GCS. Use after `getUploadSession` to recover exact progress.
328
+
329
+ ```typescript
330
+ const parts = await sdk.listUploadedParts(objectName, uploadId);
331
+ // [{ partNumber: 1, etag: 'abc' }, { partNumber: 2, etag: 'def' }]
332
+ ```
333
+
334
+ ---
335
+
336
+ ## Types
337
+
338
+ ```typescript
339
+ import type {
340
+ AssetManagerSDKConfig,
341
+ AssetType,
342
+ AssetResponse,
343
+ AssetWithRelations,
344
+ UnrealProjectVersion,
345
+ InitiateUploadRequest,
346
+ InitiateUploadResponse,
347
+ CompleteUploadRequest,
348
+ AbortUploadRequest,
349
+ UploadSession,
350
+ UploadPart,
351
+ SupportedUnrealEngineVersion,
352
+ UnrealProjectVersionTarget,
353
+ } from "odyssey-asset-manager-sdk";
354
+ ```
355
+
356
+ ---
357
+
358
+ ## Versioning
359
+
360
+ This SDK follows semantic versioning:
361
+
362
+ - **Patch** `1.0.x` — bug fixes
363
+ - **Minor** `1.x.0` — new methods added
364
+ - **Major** `x.0.0` — breaking changes
365
+
366
+ ---
367
+
368
+ ## License
369
+
370
+ Private — Odyssey Internal Use Only
@@ -0,0 +1,230 @@
1
+ type AssetType = "UNREAL_PROJECT" | "OTHER_3D";
2
+ type UploadStatus = "PENDING" | "COMPLETED" | "FAILED";
3
+ type ValidationStatus = "PENDING" | "VALID" | "INVALID";
4
+ type BuildStatus = "PENDING" | "BUILDING" | "COMPLETED" | "FAILED";
5
+ type SourceType = "UNIVERSAL_SCENE";
6
+ declare const SUPPORTED_UNREAL_ENGINE_VERSION: readonly ["5.0.3", "5.2.1"];
7
+ type SupportedUnrealEngineVersion = (typeof SUPPORTED_UNREAL_ENGINE_VERSION)[number];
8
+ declare const UNREAL_PROJECT_VERSION_TARGET: readonly ["Development", "Shipping"];
9
+ type UnrealProjectVersionTarget = (typeof UNREAL_PROJECT_VERSION_TARGET)[number];
10
+ type AssetResponse = {
11
+ id: string;
12
+ name: string;
13
+ orgId: string;
14
+ assetType: AssetType;
15
+ sourceType: SourceType;
16
+ uploadStatus: UploadStatus;
17
+ validationStatus: ValidationStatus;
18
+ buildStatus: BuildStatus;
19
+ storageBucket: string;
20
+ storagePath: string;
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ };
24
+ type UnrealProjectResponse = {
25
+ assetId: string;
26
+ orgId: string;
27
+ displayName: string;
28
+ unrealProjectVersion: string;
29
+ unrealPluginVersion: string;
30
+ createdAt: Date;
31
+ updatedAt: Date;
32
+ };
33
+ type Other3dResponse = {
34
+ assetId: string;
35
+ orgId: string;
36
+ displayName: string;
37
+ unrealPluginVersion: string;
38
+ createdAt: Date;
39
+ updatedAt: Date;
40
+ };
41
+ type AssetWithRelations = AssetResponse & {
42
+ unrealProjects?: UnrealProjectResponse[];
43
+ other3d?: Other3dResponse[];
44
+ };
45
+ type UpdateAssetInput = {
46
+ name?: string;
47
+ uploadStatus?: UploadStatus;
48
+ validationStatus?: ValidationStatus;
49
+ buildStatus?: BuildStatus;
50
+ storageBucket?: string;
51
+ storagePath?: string;
52
+ };
53
+ type UnrealProjectVersion = {
54
+ id: string;
55
+ orgId: string;
56
+ authorUserId: string;
57
+ appType: string;
58
+ unrealProjectId: string;
59
+ buildRegion: string | null;
60
+ levelFilePath: string | null;
61
+ levelName: string | null;
62
+ name: string;
63
+ packageArchiveSha256Sum: string;
64
+ packageArchiveUrl: string;
65
+ pluginVersionId: string;
66
+ selfPackaged: boolean;
67
+ state: string;
68
+ symbolsArchiveSha256Sum: string;
69
+ symbolsArchiveUrl: string;
70
+ target: string;
71
+ uploader: string;
72
+ uploadId: string | null;
73
+ objectName: string | null;
74
+ downloadUrl: string | null;
75
+ uploadSha256Sum: string | null;
76
+ unrealEngineVersion: string | null;
77
+ volumeCopyRegionsComplete: string[];
78
+ volumeRegions: string[];
79
+ volumeSizeGb: number;
80
+ unrealProjectDirectoryPath: string | null;
81
+ disableMultiplayer: boolean | null;
82
+ createdAt: Date;
83
+ updatedAt: Date;
84
+ };
85
+ type UpdateUnrealProjectVersionInput = {
86
+ name?: string;
87
+ state?: string;
88
+ target?: string;
89
+ selfPackaged?: boolean;
90
+ unrealEngineVersion?: string;
91
+ volumeRegions?: string[];
92
+ buildRegion?: string;
93
+ levelName?: string;
94
+ levelFilePath?: string;
95
+ disableMultiplayer?: boolean;
96
+ };
97
+ type User = {
98
+ id: string;
99
+ createdAt: Date;
100
+ updatedAt: Date;
101
+ };
102
+ type CreateUserInput = {
103
+ id?: string;
104
+ };
105
+ type UpdateUserInput = {
106
+ id?: string;
107
+ };
108
+ type HealthResponse = {
109
+ status: string;
110
+ timestamp: string;
111
+ };
112
+ type RedisHealthResponse = {
113
+ status: string;
114
+ latencyMs?: number;
115
+ };
116
+ type InitiateUploadRequest = {
117
+ orgId: string;
118
+ assetType: AssetType;
119
+ assetFilename: string;
120
+ assetDisplayName?: string;
121
+ unrealProjectId?: string;
122
+ unrealProjectDisplayName?: string;
123
+ unrealEngineVersion?: SupportedUnrealEngineVersion;
124
+ selfPackaged?: boolean;
125
+ target?: UnrealProjectVersionTarget;
126
+ other_3dId?: string;
127
+ other_3dDisplayName?: string;
128
+ buildRegion?: string;
129
+ volumeRegions?: string[];
130
+ };
131
+ type InitiateUploadResponse = {
132
+ orgId: string;
133
+ assetId: string;
134
+ assetVersionId: string;
135
+ uploadId: string;
136
+ objectName: string;
137
+ };
138
+ type CompleteUploadRequest = {
139
+ orgId: string;
140
+ assetId: string;
141
+ assetType: AssetType;
142
+ assetVersionId: string;
143
+ uploadId: string;
144
+ objectName: string;
145
+ parts: {
146
+ partNumber: number;
147
+ etag: string;
148
+ }[];
149
+ failed?: boolean;
150
+ sha256Sum?: string;
151
+ };
152
+ type AbortUploadRequest = {
153
+ orgId?: string;
154
+ assetId: string;
155
+ assetType: AssetType;
156
+ assetVersionId: string;
157
+ uploadId: string;
158
+ objectName: string;
159
+ };
160
+ type GetSignedUrlRequest = {
161
+ orgId: string;
162
+ assetId: string;
163
+ assetVersionId: string;
164
+ uploadId: string;
165
+ objectName: string;
166
+ partNumber: number;
167
+ };
168
+ type BatchSignedUrlsRequest = {
169
+ orgId: string;
170
+ assetId: string;
171
+ assetVersionId: string;
172
+ uploadId: string;
173
+ objectName: string;
174
+ partNumbers: number[];
175
+ };
176
+ type ListPartsRequest = {
177
+ uploadId: string;
178
+ objectName: string;
179
+ };
180
+ type UploadSession = {
181
+ orgId: string;
182
+ assetId: string;
183
+ assetVersionId: string;
184
+ uploadId: string;
185
+ objectName: string;
186
+ };
187
+ type UploadPart = {
188
+ partNumber: number;
189
+ etag: string;
190
+ };
191
+ type AssetManagerSDKConfig = {
192
+ baseUrl: string;
193
+ timeout?: number;
194
+ };
195
+
196
+ declare class AssetManagerSDK {
197
+ private http;
198
+ constructor(config: AssetManagerSDKConfig);
199
+ getHealth(): Promise<HealthResponse>;
200
+ getRedisHealth(): Promise<RedisHealthResponse>;
201
+ testRedis(): Promise<void>;
202
+ getAllAssets(): Promise<AssetWithRelations[]>;
203
+ getAsset(assetId: string): Promise<AssetWithRelations>;
204
+ getAssetsByOrg(orgId: string): Promise<AssetWithRelations[]>;
205
+ updateAsset(assetId: string, data: UpdateAssetInput): Promise<AssetWithRelations>;
206
+ markAssetAsUploaded(assetId: string): Promise<AssetWithRelations>;
207
+ markAssetAsValidated(assetId: string): Promise<AssetWithRelations>;
208
+ markAssetAsFailed(assetId: string): Promise<AssetWithRelations>;
209
+ deleteAsset(assetId: string): Promise<void>;
210
+ getProjectVersion(versionId: string): Promise<UnrealProjectVersion>;
211
+ getVersionsByAsset(assetId: string): Promise<UnrealProjectVersion[]>;
212
+ updateProjectVersion(versionId: string, data: UpdateUnrealProjectVersionInput): Promise<UnrealProjectVersion>;
213
+ deleteProjectVersion(versionId: string): Promise<void>;
214
+ deleteVersionsByAsset(assetId: string): Promise<void>;
215
+ getAllUsers(): Promise<User[]>;
216
+ getUser(userId: string): Promise<User>;
217
+ createUser(data: CreateUserInput): Promise<User>;
218
+ updateUser(userId: string, data: UpdateUserInput): Promise<User>;
219
+ deleteUser(userId: string): Promise<void>;
220
+ initiateUpload(data: InitiateUploadRequest): Promise<InitiateUploadResponse>;
221
+ getSignedUrl(orgId: string, assetId: string, assetVersionId: string, uploadId: string, objectName: string, partNumber: number): Promise<string>;
222
+ batchGetSignedUrls(orgId: string, assetId: string, assetVersionId: string, uploadId: string, objectName: string, partNumbers: number[]): Promise<Record<number, string>>;
223
+ completeUpload(data: CompleteUploadRequest): Promise<AssetWithRelations>;
224
+ abortUpload(data: AbortUploadRequest): Promise<void>;
225
+ deleteUploadRecords(data: AbortUploadRequest): Promise<void>;
226
+ getUploadSession(filename: string): Promise<UploadSession | null>;
227
+ listUploadedParts(objectName: string, uploadId: string): Promise<UploadPart[]>;
228
+ }
229
+
230
+ export { type AbortUploadRequest, AssetManagerSDK, type AssetManagerSDKConfig, type AssetResponse, type AssetType, type AssetWithRelations, type BatchSignedUrlsRequest, type BuildStatus, type CompleteUploadRequest, type CreateUserInput, type GetSignedUrlRequest, type HealthResponse, type InitiateUploadRequest, type InitiateUploadResponse, type ListPartsRequest, type Other3dResponse, type RedisHealthResponse, SUPPORTED_UNREAL_ENGINE_VERSION, type SourceType, type SupportedUnrealEngineVersion, UNREAL_PROJECT_VERSION_TARGET, type UnrealProjectResponse, type UnrealProjectVersion, type UnrealProjectVersionTarget, type UpdateAssetInput, type UpdateUnrealProjectVersionInput, type UpdateUserInput, type UploadPart, type UploadSession, type UploadStatus, type User, type ValidationStatus };
@@ -0,0 +1,230 @@
1
+ type AssetType = "UNREAL_PROJECT" | "OTHER_3D";
2
+ type UploadStatus = "PENDING" | "COMPLETED" | "FAILED";
3
+ type ValidationStatus = "PENDING" | "VALID" | "INVALID";
4
+ type BuildStatus = "PENDING" | "BUILDING" | "COMPLETED" | "FAILED";
5
+ type SourceType = "UNIVERSAL_SCENE";
6
+ declare const SUPPORTED_UNREAL_ENGINE_VERSION: readonly ["5.0.3", "5.2.1"];
7
+ type SupportedUnrealEngineVersion = (typeof SUPPORTED_UNREAL_ENGINE_VERSION)[number];
8
+ declare const UNREAL_PROJECT_VERSION_TARGET: readonly ["Development", "Shipping"];
9
+ type UnrealProjectVersionTarget = (typeof UNREAL_PROJECT_VERSION_TARGET)[number];
10
+ type AssetResponse = {
11
+ id: string;
12
+ name: string;
13
+ orgId: string;
14
+ assetType: AssetType;
15
+ sourceType: SourceType;
16
+ uploadStatus: UploadStatus;
17
+ validationStatus: ValidationStatus;
18
+ buildStatus: BuildStatus;
19
+ storageBucket: string;
20
+ storagePath: string;
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ };
24
+ type UnrealProjectResponse = {
25
+ assetId: string;
26
+ orgId: string;
27
+ displayName: string;
28
+ unrealProjectVersion: string;
29
+ unrealPluginVersion: string;
30
+ createdAt: Date;
31
+ updatedAt: Date;
32
+ };
33
+ type Other3dResponse = {
34
+ assetId: string;
35
+ orgId: string;
36
+ displayName: string;
37
+ unrealPluginVersion: string;
38
+ createdAt: Date;
39
+ updatedAt: Date;
40
+ };
41
+ type AssetWithRelations = AssetResponse & {
42
+ unrealProjects?: UnrealProjectResponse[];
43
+ other3d?: Other3dResponse[];
44
+ };
45
+ type UpdateAssetInput = {
46
+ name?: string;
47
+ uploadStatus?: UploadStatus;
48
+ validationStatus?: ValidationStatus;
49
+ buildStatus?: BuildStatus;
50
+ storageBucket?: string;
51
+ storagePath?: string;
52
+ };
53
+ type UnrealProjectVersion = {
54
+ id: string;
55
+ orgId: string;
56
+ authorUserId: string;
57
+ appType: string;
58
+ unrealProjectId: string;
59
+ buildRegion: string | null;
60
+ levelFilePath: string | null;
61
+ levelName: string | null;
62
+ name: string;
63
+ packageArchiveSha256Sum: string;
64
+ packageArchiveUrl: string;
65
+ pluginVersionId: string;
66
+ selfPackaged: boolean;
67
+ state: string;
68
+ symbolsArchiveSha256Sum: string;
69
+ symbolsArchiveUrl: string;
70
+ target: string;
71
+ uploader: string;
72
+ uploadId: string | null;
73
+ objectName: string | null;
74
+ downloadUrl: string | null;
75
+ uploadSha256Sum: string | null;
76
+ unrealEngineVersion: string | null;
77
+ volumeCopyRegionsComplete: string[];
78
+ volumeRegions: string[];
79
+ volumeSizeGb: number;
80
+ unrealProjectDirectoryPath: string | null;
81
+ disableMultiplayer: boolean | null;
82
+ createdAt: Date;
83
+ updatedAt: Date;
84
+ };
85
+ type UpdateUnrealProjectVersionInput = {
86
+ name?: string;
87
+ state?: string;
88
+ target?: string;
89
+ selfPackaged?: boolean;
90
+ unrealEngineVersion?: string;
91
+ volumeRegions?: string[];
92
+ buildRegion?: string;
93
+ levelName?: string;
94
+ levelFilePath?: string;
95
+ disableMultiplayer?: boolean;
96
+ };
97
+ type User = {
98
+ id: string;
99
+ createdAt: Date;
100
+ updatedAt: Date;
101
+ };
102
+ type CreateUserInput = {
103
+ id?: string;
104
+ };
105
+ type UpdateUserInput = {
106
+ id?: string;
107
+ };
108
+ type HealthResponse = {
109
+ status: string;
110
+ timestamp: string;
111
+ };
112
+ type RedisHealthResponse = {
113
+ status: string;
114
+ latencyMs?: number;
115
+ };
116
+ type InitiateUploadRequest = {
117
+ orgId: string;
118
+ assetType: AssetType;
119
+ assetFilename: string;
120
+ assetDisplayName?: string;
121
+ unrealProjectId?: string;
122
+ unrealProjectDisplayName?: string;
123
+ unrealEngineVersion?: SupportedUnrealEngineVersion;
124
+ selfPackaged?: boolean;
125
+ target?: UnrealProjectVersionTarget;
126
+ other_3dId?: string;
127
+ other_3dDisplayName?: string;
128
+ buildRegion?: string;
129
+ volumeRegions?: string[];
130
+ };
131
+ type InitiateUploadResponse = {
132
+ orgId: string;
133
+ assetId: string;
134
+ assetVersionId: string;
135
+ uploadId: string;
136
+ objectName: string;
137
+ };
138
+ type CompleteUploadRequest = {
139
+ orgId: string;
140
+ assetId: string;
141
+ assetType: AssetType;
142
+ assetVersionId: string;
143
+ uploadId: string;
144
+ objectName: string;
145
+ parts: {
146
+ partNumber: number;
147
+ etag: string;
148
+ }[];
149
+ failed?: boolean;
150
+ sha256Sum?: string;
151
+ };
152
+ type AbortUploadRequest = {
153
+ orgId?: string;
154
+ assetId: string;
155
+ assetType: AssetType;
156
+ assetVersionId: string;
157
+ uploadId: string;
158
+ objectName: string;
159
+ };
160
+ type GetSignedUrlRequest = {
161
+ orgId: string;
162
+ assetId: string;
163
+ assetVersionId: string;
164
+ uploadId: string;
165
+ objectName: string;
166
+ partNumber: number;
167
+ };
168
+ type BatchSignedUrlsRequest = {
169
+ orgId: string;
170
+ assetId: string;
171
+ assetVersionId: string;
172
+ uploadId: string;
173
+ objectName: string;
174
+ partNumbers: number[];
175
+ };
176
+ type ListPartsRequest = {
177
+ uploadId: string;
178
+ objectName: string;
179
+ };
180
+ type UploadSession = {
181
+ orgId: string;
182
+ assetId: string;
183
+ assetVersionId: string;
184
+ uploadId: string;
185
+ objectName: string;
186
+ };
187
+ type UploadPart = {
188
+ partNumber: number;
189
+ etag: string;
190
+ };
191
+ type AssetManagerSDKConfig = {
192
+ baseUrl: string;
193
+ timeout?: number;
194
+ };
195
+
196
+ declare class AssetManagerSDK {
197
+ private http;
198
+ constructor(config: AssetManagerSDKConfig);
199
+ getHealth(): Promise<HealthResponse>;
200
+ getRedisHealth(): Promise<RedisHealthResponse>;
201
+ testRedis(): Promise<void>;
202
+ getAllAssets(): Promise<AssetWithRelations[]>;
203
+ getAsset(assetId: string): Promise<AssetWithRelations>;
204
+ getAssetsByOrg(orgId: string): Promise<AssetWithRelations[]>;
205
+ updateAsset(assetId: string, data: UpdateAssetInput): Promise<AssetWithRelations>;
206
+ markAssetAsUploaded(assetId: string): Promise<AssetWithRelations>;
207
+ markAssetAsValidated(assetId: string): Promise<AssetWithRelations>;
208
+ markAssetAsFailed(assetId: string): Promise<AssetWithRelations>;
209
+ deleteAsset(assetId: string): Promise<void>;
210
+ getProjectVersion(versionId: string): Promise<UnrealProjectVersion>;
211
+ getVersionsByAsset(assetId: string): Promise<UnrealProjectVersion[]>;
212
+ updateProjectVersion(versionId: string, data: UpdateUnrealProjectVersionInput): Promise<UnrealProjectVersion>;
213
+ deleteProjectVersion(versionId: string): Promise<void>;
214
+ deleteVersionsByAsset(assetId: string): Promise<void>;
215
+ getAllUsers(): Promise<User[]>;
216
+ getUser(userId: string): Promise<User>;
217
+ createUser(data: CreateUserInput): Promise<User>;
218
+ updateUser(userId: string, data: UpdateUserInput): Promise<User>;
219
+ deleteUser(userId: string): Promise<void>;
220
+ initiateUpload(data: InitiateUploadRequest): Promise<InitiateUploadResponse>;
221
+ getSignedUrl(orgId: string, assetId: string, assetVersionId: string, uploadId: string, objectName: string, partNumber: number): Promise<string>;
222
+ batchGetSignedUrls(orgId: string, assetId: string, assetVersionId: string, uploadId: string, objectName: string, partNumbers: number[]): Promise<Record<number, string>>;
223
+ completeUpload(data: CompleteUploadRequest): Promise<AssetWithRelations>;
224
+ abortUpload(data: AbortUploadRequest): Promise<void>;
225
+ deleteUploadRecords(data: AbortUploadRequest): Promise<void>;
226
+ getUploadSession(filename: string): Promise<UploadSession | null>;
227
+ listUploadedParts(objectName: string, uploadId: string): Promise<UploadPart[]>;
228
+ }
229
+
230
+ export { type AbortUploadRequest, AssetManagerSDK, type AssetManagerSDKConfig, type AssetResponse, type AssetType, type AssetWithRelations, type BatchSignedUrlsRequest, type BuildStatus, type CompleteUploadRequest, type CreateUserInput, type GetSignedUrlRequest, type HealthResponse, type InitiateUploadRequest, type InitiateUploadResponse, type ListPartsRequest, type Other3dResponse, type RedisHealthResponse, SUPPORTED_UNREAL_ENGINE_VERSION, type SourceType, type SupportedUnrealEngineVersion, UNREAL_PROJECT_VERSION_TARGET, type UnrealProjectResponse, type UnrealProjectVersion, type UnrealProjectVersionTarget, type UpdateAssetInput, type UpdateUnrealProjectVersionInput, type UpdateUserInput, type UploadPart, type UploadSession, type UploadStatus, type User, type ValidationStatus };
package/dist/index.js ADDED
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ AssetManagerSDK: () => AssetManagerSDK,
34
+ SUPPORTED_UNREAL_ENGINE_VERSION: () => SUPPORTED_UNREAL_ENGINE_VERSION,
35
+ UNREAL_PROJECT_VERSION_TARGET: () => UNREAL_PROJECT_VERSION_TARGET
36
+ });
37
+ module.exports = __toCommonJS(index_exports);
38
+
39
+ // src/client.ts
40
+ var import_axios = __toESM(require("axios"));
41
+ var AssetManagerSDK = class {
42
+ constructor(config) {
43
+ var _a;
44
+ this.http = import_axios.default.create({
45
+ baseURL: config.baseUrl,
46
+ timeout: (_a = config.timeout) != null ? _a : 3e4,
47
+ headers: { "Content-Type": "application/json" }
48
+ });
49
+ }
50
+ // ─── Health ───────────────────────────────────────────────────────────────
51
+ async getHealth() {
52
+ const res = await this.http.get("/health");
53
+ return res.data.data;
54
+ }
55
+ async getRedisHealth() {
56
+ const res = await this.http.get("/health/redis");
57
+ return res.data.data;
58
+ }
59
+ async testRedis() {
60
+ await this.http.post("/health/redis/test");
61
+ }
62
+ // ─── Assets ───────────────────────────────────────────────────────────────
63
+ async getAllAssets() {
64
+ const res = await this.http.get("/assets");
65
+ return res.data.data;
66
+ }
67
+ async getAsset(assetId) {
68
+ const res = await this.http.get(`/assets/${assetId}`);
69
+ return res.data.data;
70
+ }
71
+ async getAssetsByOrg(orgId) {
72
+ const res = await this.http.get(`/assets/organization/${orgId}`);
73
+ return res.data.data;
74
+ }
75
+ async updateAsset(assetId, data) {
76
+ const res = await this.http.patch(`/assets/${assetId}`, data);
77
+ return res.data.data;
78
+ }
79
+ async markAssetAsUploaded(assetId) {
80
+ const res = await this.http.patch(`/assets/${assetId}/mark-uploaded`);
81
+ return res.data.data;
82
+ }
83
+ async markAssetAsValidated(assetId) {
84
+ const res = await this.http.patch(`/assets/${assetId}/mark-validated`);
85
+ return res.data.data;
86
+ }
87
+ async markAssetAsFailed(assetId) {
88
+ const res = await this.http.patch(`/assets/${assetId}/mark-failed`);
89
+ return res.data.data;
90
+ }
91
+ async deleteAsset(assetId) {
92
+ await this.http.delete(`/assets/${assetId}`);
93
+ }
94
+ // ─── Unreal Project Versions ──────────────────────────────────────────────
95
+ async getProjectVersion(versionId) {
96
+ const res = await this.http.get(`/unrealProjectVersion/${versionId}`);
97
+ return res.data.data;
98
+ }
99
+ async getVersionsByAsset(assetId) {
100
+ const res = await this.http.get(`/unrealProjectVersion/asset/${assetId}`);
101
+ return res.data.data;
102
+ }
103
+ async updateProjectVersion(versionId, data) {
104
+ const res = await this.http.patch(
105
+ `/unrealProjectVersion/${versionId}`,
106
+ data
107
+ );
108
+ return res.data.data;
109
+ }
110
+ async deleteProjectVersion(versionId) {
111
+ await this.http.delete(`/unrealProjectVersion/${versionId}`);
112
+ }
113
+ async deleteVersionsByAsset(assetId) {
114
+ await this.http.delete(`/unrealProjectVersion/asset/${assetId}`);
115
+ }
116
+ // ─── Users ────────────────────────────────────────────────────────────────
117
+ async getAllUsers() {
118
+ const res = await this.http.get("/users");
119
+ return res.data.data;
120
+ }
121
+ async getUser(userId) {
122
+ const res = await this.http.get(`/users/${userId}`);
123
+ return res.data.data;
124
+ }
125
+ async createUser(data) {
126
+ const res = await this.http.post("/users", data);
127
+ return res.data.data;
128
+ }
129
+ async updateUser(userId, data) {
130
+ const res = await this.http.put(`/users/${userId}`, data);
131
+ return res.data.data;
132
+ }
133
+ async deleteUser(userId) {
134
+ await this.http.delete(`/users/${userId}`);
135
+ }
136
+ // ─── Upload ───────────────────────────────────────────────────────────────
137
+ async initiateUpload(data) {
138
+ const res = await this.http.post("/uploader/initiate", data);
139
+ return res.data.data;
140
+ }
141
+ async getSignedUrl(orgId, assetId, assetVersionId, uploadId, objectName, partNumber) {
142
+ const res = await this.http.post("/uploader/signed-url", {
143
+ orgId,
144
+ assetId,
145
+ assetVersionId,
146
+ uploadId,
147
+ objectName,
148
+ partNumber
149
+ });
150
+ return res.data.data.signedUrl;
151
+ }
152
+ async batchGetSignedUrls(orgId, assetId, assetVersionId, uploadId, objectName, partNumbers) {
153
+ const res = await this.http.post("/uploader/batch-signed-urls", {
154
+ orgId,
155
+ assetId,
156
+ assetVersionId,
157
+ uploadId,
158
+ objectName,
159
+ partNumbers
160
+ });
161
+ return res.data.data.signedUrls;
162
+ }
163
+ async completeUpload(data) {
164
+ const res = await this.http.post("/uploader/complete", data);
165
+ return res.data.data;
166
+ }
167
+ async abortUpload(data) {
168
+ await this.http.post("/uploader/abort", data);
169
+ }
170
+ async deleteUploadRecords(data) {
171
+ await this.http.delete("/uploader/delete", { data });
172
+ }
173
+ // ─── Session Recovery ─────────────────────────────────────────────────────
174
+ async getUploadSession(filename) {
175
+ try {
176
+ const res = await this.http.get("/uploader/session", {
177
+ params: { filename }
178
+ });
179
+ return res.data.data;
180
+ } catch {
181
+ return null;
182
+ }
183
+ }
184
+ async listUploadedParts(objectName, uploadId) {
185
+ var _a;
186
+ try {
187
+ const res = await this.http.post("/uploader/list-parts", {
188
+ objectName,
189
+ uploadId
190
+ });
191
+ return (_a = res.data.data.parts) != null ? _a : [];
192
+ } catch {
193
+ return [];
194
+ }
195
+ }
196
+ };
197
+
198
+ // src/types.ts
199
+ var SUPPORTED_UNREAL_ENGINE_VERSION = ["5.0.3", "5.2.1"];
200
+ var UNREAL_PROJECT_VERSION_TARGET = [
201
+ "Development",
202
+ "Shipping"
203
+ ];
204
+ // Annotate the CommonJS export names for ESM import in node:
205
+ 0 && (module.exports = {
206
+ AssetManagerSDK,
207
+ SUPPORTED_UNREAL_ENGINE_VERSION,
208
+ UNREAL_PROJECT_VERSION_TARGET
209
+ });
210
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/types.ts"],"sourcesContent":["export { AssetManagerSDK } from \"./client\";\nexport * from \"./types\";\n","import axios, { AxiosInstance } from \"axios\";\nimport {\n AssetManagerSDKConfig,\n AssetWithRelations,\n UpdateAssetInput,\n UnrealProjectVersion,\n UpdateUnrealProjectVersionInput,\n User,\n CreateUserInput,\n UpdateUserInput,\n HealthResponse,\n RedisHealthResponse,\n InitiateUploadRequest,\n InitiateUploadResponse,\n CompleteUploadRequest,\n AbortUploadRequest,\n UploadSession,\n UploadPart,\n} from \"./types\";\n\nexport class AssetManagerSDK {\n private http: AxiosInstance;\n\n constructor(config: AssetManagerSDKConfig) {\n this.http = axios.create({\n baseURL: config.baseUrl,\n timeout: config.timeout ?? 30000,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // ─── Health ───────────────────────────────────────────────────────────────\n\n async getHealth(): Promise<HealthResponse> {\n const res = await this.http.get(\"/health\");\n return res.data.data;\n }\n\n async getRedisHealth(): Promise<RedisHealthResponse> {\n const res = await this.http.get(\"/health/redis\");\n return res.data.data;\n }\n\n async testRedis(): Promise<void> {\n await this.http.post(\"/health/redis/test\");\n }\n\n // ─── Assets ───────────────────────────────────────────────────────────────\n\n async getAllAssets(): Promise<AssetWithRelations[]> {\n const res = await this.http.get(\"/assets\");\n return res.data.data;\n }\n\n async getAsset(assetId: string): Promise<AssetWithRelations> {\n const res = await this.http.get(`/assets/${assetId}`);\n return res.data.data;\n }\n\n async getAssetsByOrg(orgId: string): Promise<AssetWithRelations[]> {\n const res = await this.http.get(`/assets/organization/${orgId}`);\n return res.data.data;\n }\n\n async updateAsset(\n assetId: string,\n data: UpdateAssetInput,\n ): Promise<AssetWithRelations> {\n const res = await this.http.patch(`/assets/${assetId}`, data);\n return res.data.data;\n }\n\n async markAssetAsUploaded(assetId: string): Promise<AssetWithRelations> {\n const res = await this.http.patch(`/assets/${assetId}/mark-uploaded`);\n return res.data.data;\n }\n\n async markAssetAsValidated(assetId: string): Promise<AssetWithRelations> {\n const res = await this.http.patch(`/assets/${assetId}/mark-validated`);\n return res.data.data;\n }\n\n async markAssetAsFailed(assetId: string): Promise<AssetWithRelations> {\n const res = await this.http.patch(`/assets/${assetId}/mark-failed`);\n return res.data.data;\n }\n\n async deleteAsset(assetId: string): Promise<void> {\n await this.http.delete(`/assets/${assetId}`);\n }\n\n // ─── Unreal Project Versions ──────────────────────────────────────────────\n\n async getProjectVersion(versionId: string): Promise<UnrealProjectVersion> {\n const res = await this.http.get(`/unrealProjectVersion/${versionId}`);\n return res.data.data;\n }\n\n async getVersionsByAsset(assetId: string): Promise<UnrealProjectVersion[]> {\n const res = await this.http.get(`/unrealProjectVersion/asset/${assetId}`);\n return res.data.data;\n }\n\n async updateProjectVersion(\n versionId: string,\n data: UpdateUnrealProjectVersionInput,\n ): Promise<UnrealProjectVersion> {\n const res = await this.http.patch(\n `/unrealProjectVersion/${versionId}`,\n data,\n );\n return res.data.data;\n }\n\n async deleteProjectVersion(versionId: string): Promise<void> {\n await this.http.delete(`/unrealProjectVersion/${versionId}`);\n }\n\n async deleteVersionsByAsset(assetId: string): Promise<void> {\n await this.http.delete(`/unrealProjectVersion/asset/${assetId}`);\n }\n\n // ─── Users ────────────────────────────────────────────────────────────────\n\n async getAllUsers(): Promise<User[]> {\n const res = await this.http.get(\"/users\");\n return res.data.data;\n }\n\n async getUser(userId: string): Promise<User> {\n const res = await this.http.get(`/users/${userId}`);\n return res.data.data;\n }\n\n async createUser(data: CreateUserInput): Promise<User> {\n const res = await this.http.post(\"/users\", data);\n return res.data.data;\n }\n\n async updateUser(userId: string, data: UpdateUserInput): Promise<User> {\n const res = await this.http.put(`/users/${userId}`, data);\n return res.data.data;\n }\n\n async deleteUser(userId: string): Promise<void> {\n await this.http.delete(`/users/${userId}`);\n }\n\n // ─── Upload ───────────────────────────────────────────────────────────────\n\n async initiateUpload(\n data: InitiateUploadRequest,\n ): Promise<InitiateUploadResponse> {\n const res = await this.http.post(\"/uploader/initiate\", data);\n return res.data.data;\n }\n\n async getSignedUrl(\n orgId: string,\n assetId: string,\n assetVersionId: string,\n uploadId: string,\n objectName: string,\n partNumber: number,\n ): Promise<string> {\n const res = await this.http.post(\"/uploader/signed-url\", {\n orgId,\n assetId,\n assetVersionId,\n uploadId,\n objectName,\n partNumber,\n });\n return res.data.data.signedUrl;\n }\n\n async batchGetSignedUrls(\n orgId: string,\n assetId: string,\n assetVersionId: string,\n uploadId: string,\n objectName: string,\n partNumbers: number[],\n ): Promise<Record<number, string>> {\n const res = await this.http.post(\"/uploader/batch-signed-urls\", {\n orgId,\n assetId,\n assetVersionId,\n uploadId,\n objectName,\n partNumbers,\n });\n return res.data.data.signedUrls;\n }\n\n async completeUpload(\n data: CompleteUploadRequest,\n ): Promise<AssetWithRelations> {\n const res = await this.http.post(\"/uploader/complete\", data);\n return res.data.data;\n }\n\n async abortUpload(data: AbortUploadRequest): Promise<void> {\n await this.http.post(\"/uploader/abort\", data);\n }\n\n async deleteUploadRecords(data: AbortUploadRequest): Promise<void> {\n await this.http.delete(\"/uploader/delete\", { data });\n }\n\n // ─── Session Recovery ─────────────────────────────────────────────────────\n\n async getUploadSession(filename: string): Promise<UploadSession | null> {\n try {\n const res = await this.http.get(\"/uploader/session\", {\n params: { filename },\n });\n return res.data.data;\n } catch {\n return null;\n }\n }\n\n async listUploadedParts(\n objectName: string,\n uploadId: string,\n ): Promise<UploadPart[]> {\n try {\n const res = await this.http.post(\"/uploader/list-parts\", {\n objectName,\n uploadId,\n });\n return res.data.data.parts ?? [];\n } catch {\n return [];\n }\n }\n}\n","// ─── Enums & Constants ────────────────────────────────────────────────────\n\nexport type AssetType = \"UNREAL_PROJECT\" | \"OTHER_3D\";\nexport type UploadStatus = \"PENDING\" | \"COMPLETED\" | \"FAILED\";\nexport type ValidationStatus = \"PENDING\" | \"VALID\" | \"INVALID\";\nexport type BuildStatus = \"PENDING\" | \"BUILDING\" | \"COMPLETED\" | \"FAILED\";\nexport type SourceType = \"UNIVERSAL_SCENE\";\n\nexport const SUPPORTED_UNREAL_ENGINE_VERSION = [\"5.0.3\", \"5.2.1\"] as const;\nexport type SupportedUnrealEngineVersion =\n (typeof SUPPORTED_UNREAL_ENGINE_VERSION)[number];\n\nexport const UNREAL_PROJECT_VERSION_TARGET = [\n \"Development\",\n \"Shipping\",\n] as const;\nexport type UnrealProjectVersionTarget =\n (typeof UNREAL_PROJECT_VERSION_TARGET)[number];\n\n// ─── Asset Types ──────────────────────────────────────────────────────────\n\nexport type AssetResponse = {\n id: string;\n name: string;\n orgId: string;\n assetType: AssetType;\n sourceType: SourceType;\n uploadStatus: UploadStatus;\n validationStatus: ValidationStatus;\n buildStatus: BuildStatus;\n storageBucket: string;\n storagePath: string;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type UnrealProjectResponse = {\n assetId: string;\n orgId: string;\n displayName: string;\n unrealProjectVersion: string;\n unrealPluginVersion: string;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type Other3dResponse = {\n assetId: string;\n orgId: string;\n displayName: string;\n unrealPluginVersion: string;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type AssetWithRelations = AssetResponse & {\n unrealProjects?: UnrealProjectResponse[];\n other3d?: Other3dResponse[];\n};\n\nexport type UpdateAssetInput = {\n name?: string;\n uploadStatus?: UploadStatus;\n validationStatus?: ValidationStatus;\n buildStatus?: BuildStatus;\n storageBucket?: string;\n storagePath?: string;\n};\n\n// ─── Unreal Project Version Types ─────────────────────────────────────────\n\nexport type UnrealProjectVersion = {\n id: string;\n orgId: string;\n authorUserId: string;\n appType: string;\n unrealProjectId: string;\n buildRegion: string | null;\n levelFilePath: string | null;\n levelName: string | null;\n name: string;\n packageArchiveSha256Sum: string;\n packageArchiveUrl: string;\n pluginVersionId: string;\n selfPackaged: boolean;\n state: string;\n symbolsArchiveSha256Sum: string;\n symbolsArchiveUrl: string;\n target: string;\n uploader: string;\n uploadId: string | null;\n objectName: string | null;\n downloadUrl: string | null;\n uploadSha256Sum: string | null;\n unrealEngineVersion: string | null;\n volumeCopyRegionsComplete: string[];\n volumeRegions: string[];\n volumeSizeGb: number;\n unrealProjectDirectoryPath: string | null;\n disableMultiplayer: boolean | null;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type UpdateUnrealProjectVersionInput = {\n name?: string;\n state?: string;\n target?: string;\n selfPackaged?: boolean;\n unrealEngineVersion?: string;\n volumeRegions?: string[];\n buildRegion?: string;\n levelName?: string;\n levelFilePath?: string;\n disableMultiplayer?: boolean;\n};\n\n// ─── User Types ───────────────────────────────────────────────────────────\n\nexport type User = {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type CreateUserInput = {\n id?: string;\n};\n\nexport type UpdateUserInput = {\n id?: string;\n};\n\n// ─── Health Types ─────────────────────────────────────────────────────────\n\nexport type HealthResponse = {\n status: string;\n timestamp: string;\n};\n\nexport type RedisHealthResponse = {\n status: string;\n latencyMs?: number;\n};\n\n// ─── Upload Types ──────────────────────────────────────────────────────────\n\nexport type InitiateUploadRequest = {\n orgId: string;\n assetType: AssetType;\n assetFilename: string;\n assetDisplayName?: string;\n unrealProjectId?: string;\n unrealProjectDisplayName?: string;\n unrealEngineVersion?: SupportedUnrealEngineVersion;\n selfPackaged?: boolean;\n target?: UnrealProjectVersionTarget;\n other_3dId?: string;\n other_3dDisplayName?: string;\n buildRegion?: string;\n volumeRegions?: string[];\n};\n\nexport type InitiateUploadResponse = {\n orgId: string;\n assetId: string;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n};\n\nexport type CompleteUploadRequest = {\n orgId: string;\n assetId: string;\n assetType: AssetType;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n parts: { partNumber: number; etag: string }[];\n failed?: boolean;\n sha256Sum?: string;\n};\n\nexport type AbortUploadRequest = {\n orgId?: string;\n assetId: string;\n assetType: AssetType;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n};\n\nexport type GetSignedUrlRequest = {\n orgId: string;\n assetId: string;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n partNumber: number;\n};\n\nexport type BatchSignedUrlsRequest = {\n orgId: string;\n assetId: string;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n partNumbers: number[];\n};\n\nexport type ListPartsRequest = {\n uploadId: string;\n objectName: string;\n};\n\nexport type UploadSession = {\n orgId: string;\n assetId: string;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n};\n\nexport type UploadPart = {\n partNumber: number;\n etag: string;\n};\n\n// ─── SDK Config ────────────────────────────────────────────────────────────\n\nexport type AssetManagerSDKConfig = {\n baseUrl: string;\n timeout?: number;\n};\n"],"mappings":"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","names":["axios"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,171 @@
1
+ // src/client.ts
2
+ import axios from "axios";
3
+ var AssetManagerSDK = class {
4
+ constructor(config) {
5
+ var _a;
6
+ this.http = axios.create({
7
+ baseURL: config.baseUrl,
8
+ timeout: (_a = config.timeout) != null ? _a : 3e4,
9
+ headers: { "Content-Type": "application/json" }
10
+ });
11
+ }
12
+ // ─── Health ───────────────────────────────────────────────────────────────
13
+ async getHealth() {
14
+ const res = await this.http.get("/health");
15
+ return res.data.data;
16
+ }
17
+ async getRedisHealth() {
18
+ const res = await this.http.get("/health/redis");
19
+ return res.data.data;
20
+ }
21
+ async testRedis() {
22
+ await this.http.post("/health/redis/test");
23
+ }
24
+ // ─── Assets ───────────────────────────────────────────────────────────────
25
+ async getAllAssets() {
26
+ const res = await this.http.get("/assets");
27
+ return res.data.data;
28
+ }
29
+ async getAsset(assetId) {
30
+ const res = await this.http.get(`/assets/${assetId}`);
31
+ return res.data.data;
32
+ }
33
+ async getAssetsByOrg(orgId) {
34
+ const res = await this.http.get(`/assets/organization/${orgId}`);
35
+ return res.data.data;
36
+ }
37
+ async updateAsset(assetId, data) {
38
+ const res = await this.http.patch(`/assets/${assetId}`, data);
39
+ return res.data.data;
40
+ }
41
+ async markAssetAsUploaded(assetId) {
42
+ const res = await this.http.patch(`/assets/${assetId}/mark-uploaded`);
43
+ return res.data.data;
44
+ }
45
+ async markAssetAsValidated(assetId) {
46
+ const res = await this.http.patch(`/assets/${assetId}/mark-validated`);
47
+ return res.data.data;
48
+ }
49
+ async markAssetAsFailed(assetId) {
50
+ const res = await this.http.patch(`/assets/${assetId}/mark-failed`);
51
+ return res.data.data;
52
+ }
53
+ async deleteAsset(assetId) {
54
+ await this.http.delete(`/assets/${assetId}`);
55
+ }
56
+ // ─── Unreal Project Versions ──────────────────────────────────────────────
57
+ async getProjectVersion(versionId) {
58
+ const res = await this.http.get(`/unrealProjectVersion/${versionId}`);
59
+ return res.data.data;
60
+ }
61
+ async getVersionsByAsset(assetId) {
62
+ const res = await this.http.get(`/unrealProjectVersion/asset/${assetId}`);
63
+ return res.data.data;
64
+ }
65
+ async updateProjectVersion(versionId, data) {
66
+ const res = await this.http.patch(
67
+ `/unrealProjectVersion/${versionId}`,
68
+ data
69
+ );
70
+ return res.data.data;
71
+ }
72
+ async deleteProjectVersion(versionId) {
73
+ await this.http.delete(`/unrealProjectVersion/${versionId}`);
74
+ }
75
+ async deleteVersionsByAsset(assetId) {
76
+ await this.http.delete(`/unrealProjectVersion/asset/${assetId}`);
77
+ }
78
+ // ─── Users ────────────────────────────────────────────────────────────────
79
+ async getAllUsers() {
80
+ const res = await this.http.get("/users");
81
+ return res.data.data;
82
+ }
83
+ async getUser(userId) {
84
+ const res = await this.http.get(`/users/${userId}`);
85
+ return res.data.data;
86
+ }
87
+ async createUser(data) {
88
+ const res = await this.http.post("/users", data);
89
+ return res.data.data;
90
+ }
91
+ async updateUser(userId, data) {
92
+ const res = await this.http.put(`/users/${userId}`, data);
93
+ return res.data.data;
94
+ }
95
+ async deleteUser(userId) {
96
+ await this.http.delete(`/users/${userId}`);
97
+ }
98
+ // ─── Upload ───────────────────────────────────────────────────────────────
99
+ async initiateUpload(data) {
100
+ const res = await this.http.post("/uploader/initiate", data);
101
+ return res.data.data;
102
+ }
103
+ async getSignedUrl(orgId, assetId, assetVersionId, uploadId, objectName, partNumber) {
104
+ const res = await this.http.post("/uploader/signed-url", {
105
+ orgId,
106
+ assetId,
107
+ assetVersionId,
108
+ uploadId,
109
+ objectName,
110
+ partNumber
111
+ });
112
+ return res.data.data.signedUrl;
113
+ }
114
+ async batchGetSignedUrls(orgId, assetId, assetVersionId, uploadId, objectName, partNumbers) {
115
+ const res = await this.http.post("/uploader/batch-signed-urls", {
116
+ orgId,
117
+ assetId,
118
+ assetVersionId,
119
+ uploadId,
120
+ objectName,
121
+ partNumbers
122
+ });
123
+ return res.data.data.signedUrls;
124
+ }
125
+ async completeUpload(data) {
126
+ const res = await this.http.post("/uploader/complete", data);
127
+ return res.data.data;
128
+ }
129
+ async abortUpload(data) {
130
+ await this.http.post("/uploader/abort", data);
131
+ }
132
+ async deleteUploadRecords(data) {
133
+ await this.http.delete("/uploader/delete", { data });
134
+ }
135
+ // ─── Session Recovery ─────────────────────────────────────────────────────
136
+ async getUploadSession(filename) {
137
+ try {
138
+ const res = await this.http.get("/uploader/session", {
139
+ params: { filename }
140
+ });
141
+ return res.data.data;
142
+ } catch {
143
+ return null;
144
+ }
145
+ }
146
+ async listUploadedParts(objectName, uploadId) {
147
+ var _a;
148
+ try {
149
+ const res = await this.http.post("/uploader/list-parts", {
150
+ objectName,
151
+ uploadId
152
+ });
153
+ return (_a = res.data.data.parts) != null ? _a : [];
154
+ } catch {
155
+ return [];
156
+ }
157
+ }
158
+ };
159
+
160
+ // src/types.ts
161
+ var SUPPORTED_UNREAL_ENGINE_VERSION = ["5.0.3", "5.2.1"];
162
+ var UNREAL_PROJECT_VERSION_TARGET = [
163
+ "Development",
164
+ "Shipping"
165
+ ];
166
+ export {
167
+ AssetManagerSDK,
168
+ SUPPORTED_UNREAL_ENGINE_VERSION,
169
+ UNREAL_PROJECT_VERSION_TARGET
170
+ };
171
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts","../src/types.ts"],"sourcesContent":["import axios, { AxiosInstance } from \"axios\";\nimport {\n AssetManagerSDKConfig,\n AssetWithRelations,\n UpdateAssetInput,\n UnrealProjectVersion,\n UpdateUnrealProjectVersionInput,\n User,\n CreateUserInput,\n UpdateUserInput,\n HealthResponse,\n RedisHealthResponse,\n InitiateUploadRequest,\n InitiateUploadResponse,\n CompleteUploadRequest,\n AbortUploadRequest,\n UploadSession,\n UploadPart,\n} from \"./types\";\n\nexport class AssetManagerSDK {\n private http: AxiosInstance;\n\n constructor(config: AssetManagerSDKConfig) {\n this.http = axios.create({\n baseURL: config.baseUrl,\n timeout: config.timeout ?? 30000,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // ─── Health ───────────────────────────────────────────────────────────────\n\n async getHealth(): Promise<HealthResponse> {\n const res = await this.http.get(\"/health\");\n return res.data.data;\n }\n\n async getRedisHealth(): Promise<RedisHealthResponse> {\n const res = await this.http.get(\"/health/redis\");\n return res.data.data;\n }\n\n async testRedis(): Promise<void> {\n await this.http.post(\"/health/redis/test\");\n }\n\n // ─── Assets ───────────────────────────────────────────────────────────────\n\n async getAllAssets(): Promise<AssetWithRelations[]> {\n const res = await this.http.get(\"/assets\");\n return res.data.data;\n }\n\n async getAsset(assetId: string): Promise<AssetWithRelations> {\n const res = await this.http.get(`/assets/${assetId}`);\n return res.data.data;\n }\n\n async getAssetsByOrg(orgId: string): Promise<AssetWithRelations[]> {\n const res = await this.http.get(`/assets/organization/${orgId}`);\n return res.data.data;\n }\n\n async updateAsset(\n assetId: string,\n data: UpdateAssetInput,\n ): Promise<AssetWithRelations> {\n const res = await this.http.patch(`/assets/${assetId}`, data);\n return res.data.data;\n }\n\n async markAssetAsUploaded(assetId: string): Promise<AssetWithRelations> {\n const res = await this.http.patch(`/assets/${assetId}/mark-uploaded`);\n return res.data.data;\n }\n\n async markAssetAsValidated(assetId: string): Promise<AssetWithRelations> {\n const res = await this.http.patch(`/assets/${assetId}/mark-validated`);\n return res.data.data;\n }\n\n async markAssetAsFailed(assetId: string): Promise<AssetWithRelations> {\n const res = await this.http.patch(`/assets/${assetId}/mark-failed`);\n return res.data.data;\n }\n\n async deleteAsset(assetId: string): Promise<void> {\n await this.http.delete(`/assets/${assetId}`);\n }\n\n // ─── Unreal Project Versions ──────────────────────────────────────────────\n\n async getProjectVersion(versionId: string): Promise<UnrealProjectVersion> {\n const res = await this.http.get(`/unrealProjectVersion/${versionId}`);\n return res.data.data;\n }\n\n async getVersionsByAsset(assetId: string): Promise<UnrealProjectVersion[]> {\n const res = await this.http.get(`/unrealProjectVersion/asset/${assetId}`);\n return res.data.data;\n }\n\n async updateProjectVersion(\n versionId: string,\n data: UpdateUnrealProjectVersionInput,\n ): Promise<UnrealProjectVersion> {\n const res = await this.http.patch(\n `/unrealProjectVersion/${versionId}`,\n data,\n );\n return res.data.data;\n }\n\n async deleteProjectVersion(versionId: string): Promise<void> {\n await this.http.delete(`/unrealProjectVersion/${versionId}`);\n }\n\n async deleteVersionsByAsset(assetId: string): Promise<void> {\n await this.http.delete(`/unrealProjectVersion/asset/${assetId}`);\n }\n\n // ─── Users ────────────────────────────────────────────────────────────────\n\n async getAllUsers(): Promise<User[]> {\n const res = await this.http.get(\"/users\");\n return res.data.data;\n }\n\n async getUser(userId: string): Promise<User> {\n const res = await this.http.get(`/users/${userId}`);\n return res.data.data;\n }\n\n async createUser(data: CreateUserInput): Promise<User> {\n const res = await this.http.post(\"/users\", data);\n return res.data.data;\n }\n\n async updateUser(userId: string, data: UpdateUserInput): Promise<User> {\n const res = await this.http.put(`/users/${userId}`, data);\n return res.data.data;\n }\n\n async deleteUser(userId: string): Promise<void> {\n await this.http.delete(`/users/${userId}`);\n }\n\n // ─── Upload ───────────────────────────────────────────────────────────────\n\n async initiateUpload(\n data: InitiateUploadRequest,\n ): Promise<InitiateUploadResponse> {\n const res = await this.http.post(\"/uploader/initiate\", data);\n return res.data.data;\n }\n\n async getSignedUrl(\n orgId: string,\n assetId: string,\n assetVersionId: string,\n uploadId: string,\n objectName: string,\n partNumber: number,\n ): Promise<string> {\n const res = await this.http.post(\"/uploader/signed-url\", {\n orgId,\n assetId,\n assetVersionId,\n uploadId,\n objectName,\n partNumber,\n });\n return res.data.data.signedUrl;\n }\n\n async batchGetSignedUrls(\n orgId: string,\n assetId: string,\n assetVersionId: string,\n uploadId: string,\n objectName: string,\n partNumbers: number[],\n ): Promise<Record<number, string>> {\n const res = await this.http.post(\"/uploader/batch-signed-urls\", {\n orgId,\n assetId,\n assetVersionId,\n uploadId,\n objectName,\n partNumbers,\n });\n return res.data.data.signedUrls;\n }\n\n async completeUpload(\n data: CompleteUploadRequest,\n ): Promise<AssetWithRelations> {\n const res = await this.http.post(\"/uploader/complete\", data);\n return res.data.data;\n }\n\n async abortUpload(data: AbortUploadRequest): Promise<void> {\n await this.http.post(\"/uploader/abort\", data);\n }\n\n async deleteUploadRecords(data: AbortUploadRequest): Promise<void> {\n await this.http.delete(\"/uploader/delete\", { data });\n }\n\n // ─── Session Recovery ─────────────────────────────────────────────────────\n\n async getUploadSession(filename: string): Promise<UploadSession | null> {\n try {\n const res = await this.http.get(\"/uploader/session\", {\n params: { filename },\n });\n return res.data.data;\n } catch {\n return null;\n }\n }\n\n async listUploadedParts(\n objectName: string,\n uploadId: string,\n ): Promise<UploadPart[]> {\n try {\n const res = await this.http.post(\"/uploader/list-parts\", {\n objectName,\n uploadId,\n });\n return res.data.data.parts ?? [];\n } catch {\n return [];\n }\n }\n}\n","// ─── Enums & Constants ────────────────────────────────────────────────────\n\nexport type AssetType = \"UNREAL_PROJECT\" | \"OTHER_3D\";\nexport type UploadStatus = \"PENDING\" | \"COMPLETED\" | \"FAILED\";\nexport type ValidationStatus = \"PENDING\" | \"VALID\" | \"INVALID\";\nexport type BuildStatus = \"PENDING\" | \"BUILDING\" | \"COMPLETED\" | \"FAILED\";\nexport type SourceType = \"UNIVERSAL_SCENE\";\n\nexport const SUPPORTED_UNREAL_ENGINE_VERSION = [\"5.0.3\", \"5.2.1\"] as const;\nexport type SupportedUnrealEngineVersion =\n (typeof SUPPORTED_UNREAL_ENGINE_VERSION)[number];\n\nexport const UNREAL_PROJECT_VERSION_TARGET = [\n \"Development\",\n \"Shipping\",\n] as const;\nexport type UnrealProjectVersionTarget =\n (typeof UNREAL_PROJECT_VERSION_TARGET)[number];\n\n// ─── Asset Types ──────────────────────────────────────────────────────────\n\nexport type AssetResponse = {\n id: string;\n name: string;\n orgId: string;\n assetType: AssetType;\n sourceType: SourceType;\n uploadStatus: UploadStatus;\n validationStatus: ValidationStatus;\n buildStatus: BuildStatus;\n storageBucket: string;\n storagePath: string;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type UnrealProjectResponse = {\n assetId: string;\n orgId: string;\n displayName: string;\n unrealProjectVersion: string;\n unrealPluginVersion: string;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type Other3dResponse = {\n assetId: string;\n orgId: string;\n displayName: string;\n unrealPluginVersion: string;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type AssetWithRelations = AssetResponse & {\n unrealProjects?: UnrealProjectResponse[];\n other3d?: Other3dResponse[];\n};\n\nexport type UpdateAssetInput = {\n name?: string;\n uploadStatus?: UploadStatus;\n validationStatus?: ValidationStatus;\n buildStatus?: BuildStatus;\n storageBucket?: string;\n storagePath?: string;\n};\n\n// ─── Unreal Project Version Types ─────────────────────────────────────────\n\nexport type UnrealProjectVersion = {\n id: string;\n orgId: string;\n authorUserId: string;\n appType: string;\n unrealProjectId: string;\n buildRegion: string | null;\n levelFilePath: string | null;\n levelName: string | null;\n name: string;\n packageArchiveSha256Sum: string;\n packageArchiveUrl: string;\n pluginVersionId: string;\n selfPackaged: boolean;\n state: string;\n symbolsArchiveSha256Sum: string;\n symbolsArchiveUrl: string;\n target: string;\n uploader: string;\n uploadId: string | null;\n objectName: string | null;\n downloadUrl: string | null;\n uploadSha256Sum: string | null;\n unrealEngineVersion: string | null;\n volumeCopyRegionsComplete: string[];\n volumeRegions: string[];\n volumeSizeGb: number;\n unrealProjectDirectoryPath: string | null;\n disableMultiplayer: boolean | null;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type UpdateUnrealProjectVersionInput = {\n name?: string;\n state?: string;\n target?: string;\n selfPackaged?: boolean;\n unrealEngineVersion?: string;\n volumeRegions?: string[];\n buildRegion?: string;\n levelName?: string;\n levelFilePath?: string;\n disableMultiplayer?: boolean;\n};\n\n// ─── User Types ───────────────────────────────────────────────────────────\n\nexport type User = {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type CreateUserInput = {\n id?: string;\n};\n\nexport type UpdateUserInput = {\n id?: string;\n};\n\n// ─── Health Types ─────────────────────────────────────────────────────────\n\nexport type HealthResponse = {\n status: string;\n timestamp: string;\n};\n\nexport type RedisHealthResponse = {\n status: string;\n latencyMs?: number;\n};\n\n// ─── Upload Types ──────────────────────────────────────────────────────────\n\nexport type InitiateUploadRequest = {\n orgId: string;\n assetType: AssetType;\n assetFilename: string;\n assetDisplayName?: string;\n unrealProjectId?: string;\n unrealProjectDisplayName?: string;\n unrealEngineVersion?: SupportedUnrealEngineVersion;\n selfPackaged?: boolean;\n target?: UnrealProjectVersionTarget;\n other_3dId?: string;\n other_3dDisplayName?: string;\n buildRegion?: string;\n volumeRegions?: string[];\n};\n\nexport type InitiateUploadResponse = {\n orgId: string;\n assetId: string;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n};\n\nexport type CompleteUploadRequest = {\n orgId: string;\n assetId: string;\n assetType: AssetType;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n parts: { partNumber: number; etag: string }[];\n failed?: boolean;\n sha256Sum?: string;\n};\n\nexport type AbortUploadRequest = {\n orgId?: string;\n assetId: string;\n assetType: AssetType;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n};\n\nexport type GetSignedUrlRequest = {\n orgId: string;\n assetId: string;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n partNumber: number;\n};\n\nexport type BatchSignedUrlsRequest = {\n orgId: string;\n assetId: string;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n partNumbers: number[];\n};\n\nexport type ListPartsRequest = {\n uploadId: string;\n objectName: string;\n};\n\nexport type UploadSession = {\n orgId: string;\n assetId: string;\n assetVersionId: string;\n uploadId: string;\n objectName: string;\n};\n\nexport type UploadPart = {\n partNumber: number;\n etag: string;\n};\n\n// ─── SDK Config ────────────────────────────────────────────────────────────\n\nexport type AssetManagerSDKConfig = {\n baseUrl: string;\n timeout?: number;\n};\n"],"mappings":";AAAA,OAAO,WAA8B;AAoB9B,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YAAY,QAA+B;AAvB7C;AAwBI,SAAK,OAAO,MAAM,OAAO;AAAA,MACvB,SAAS,OAAO;AAAA,MAChB,UAAS,YAAO,YAAP,YAAkB;AAAA,MAC3B,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,YAAqC;AACzC,UAAM,MAAM,MAAM,KAAK,KAAK,IAAI,SAAS;AACzC,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,iBAA+C;AACnD,UAAM,MAAM,MAAM,KAAK,KAAK,IAAI,eAAe;AAC/C,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,YAA2B;AAC/B,UAAM,KAAK,KAAK,KAAK,oBAAoB;AAAA,EAC3C;AAAA;AAAA,EAIA,MAAM,eAA8C;AAClD,UAAM,MAAM,MAAM,KAAK,KAAK,IAAI,SAAS;AACzC,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,SAAS,SAA8C;AAC3D,UAAM,MAAM,MAAM,KAAK,KAAK,IAAI,WAAW,OAAO,EAAE;AACpD,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,eAAe,OAA8C;AACjE,UAAM,MAAM,MAAM,KAAK,KAAK,IAAI,wBAAwB,KAAK,EAAE;AAC/D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,YACJ,SACA,MAC6B;AAC7B,UAAM,MAAM,MAAM,KAAK,KAAK,MAAM,WAAW,OAAO,IAAI,IAAI;AAC5D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,oBAAoB,SAA8C;AACtE,UAAM,MAAM,MAAM,KAAK,KAAK,MAAM,WAAW,OAAO,gBAAgB;AACpE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,qBAAqB,SAA8C;AACvE,UAAM,MAAM,MAAM,KAAK,KAAK,MAAM,WAAW,OAAO,iBAAiB;AACrE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,kBAAkB,SAA8C;AACpE,UAAM,MAAM,MAAM,KAAK,KAAK,MAAM,WAAW,OAAO,cAAc;AAClE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,YAAY,SAAgC;AAChD,UAAM,KAAK,KAAK,OAAO,WAAW,OAAO,EAAE;AAAA,EAC7C;AAAA;AAAA,EAIA,MAAM,kBAAkB,WAAkD;AACxE,UAAM,MAAM,MAAM,KAAK,KAAK,IAAI,yBAAyB,SAAS,EAAE;AACpE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,mBAAmB,SAAkD;AACzE,UAAM,MAAM,MAAM,KAAK,KAAK,IAAI,+BAA+B,OAAO,EAAE;AACxE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,qBACJ,WACA,MAC+B;AAC/B,UAAM,MAAM,MAAM,KAAK,KAAK;AAAA,MAC1B,yBAAyB,SAAS;AAAA,MAClC;AAAA,IACF;AACA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,qBAAqB,WAAkC;AAC3D,UAAM,KAAK,KAAK,OAAO,yBAAyB,SAAS,EAAE;AAAA,EAC7D;AAAA,EAEA,MAAM,sBAAsB,SAAgC;AAC1D,UAAM,KAAK,KAAK,OAAO,+BAA+B,OAAO,EAAE;AAAA,EACjE;AAAA;AAAA,EAIA,MAAM,cAA+B;AACnC,UAAM,MAAM,MAAM,KAAK,KAAK,IAAI,QAAQ;AACxC,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,QAAQ,QAA+B;AAC3C,UAAM,MAAM,MAAM,KAAK,KAAK,IAAI,UAAU,MAAM,EAAE;AAClD,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,WAAW,MAAsC;AACrD,UAAM,MAAM,MAAM,KAAK,KAAK,KAAK,UAAU,IAAI;AAC/C,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,WAAW,QAAgB,MAAsC;AACrE,UAAM,MAAM,MAAM,KAAK,KAAK,IAAI,UAAU,MAAM,IAAI,IAAI;AACxD,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,WAAW,QAA+B;AAC9C,UAAM,KAAK,KAAK,OAAO,UAAU,MAAM,EAAE;AAAA,EAC3C;AAAA;AAAA,EAIA,MAAM,eACJ,MACiC;AACjC,UAAM,MAAM,MAAM,KAAK,KAAK,KAAK,sBAAsB,IAAI;AAC3D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,aACJ,OACA,SACA,gBACA,UACA,YACA,YACiB;AACjB,UAAM,MAAM,MAAM,KAAK,KAAK,KAAK,wBAAwB;AAAA,MACvD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,IAAI,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,mBACJ,OACA,SACA,gBACA,UACA,YACA,aACiC;AACjC,UAAM,MAAM,MAAM,KAAK,KAAK,KAAK,+BAA+B;AAAA,MAC9D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,IAAI,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,eACJ,MAC6B;AAC7B,UAAM,MAAM,MAAM,KAAK,KAAK,KAAK,sBAAsB,IAAI;AAC3D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,YAAY,MAAyC;AACzD,UAAM,KAAK,KAAK,KAAK,mBAAmB,IAAI;AAAA,EAC9C;AAAA,EAEA,MAAM,oBAAoB,MAAyC;AACjE,UAAM,KAAK,KAAK,OAAO,oBAAoB,EAAE,KAAK,CAAC;AAAA,EACrD;AAAA;AAAA,EAIA,MAAM,iBAAiB,UAAiD;AACtE,QAAI;AACF,YAAM,MAAM,MAAM,KAAK,KAAK,IAAI,qBAAqB;AAAA,QACnD,QAAQ,EAAE,SAAS;AAAA,MACrB,CAAC;AACD,aAAO,IAAI,KAAK;AAAA,IAClB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,kBACJ,YACA,UACuB;AAlO3B;AAmOI,QAAI;AACF,YAAM,MAAM,MAAM,KAAK,KAAK,KAAK,wBAAwB;AAAA,QACvD;AAAA,QACA;AAAA,MACF,CAAC;AACD,cAAO,SAAI,KAAK,KAAK,UAAd,YAAuB,CAAC;AAAA,IACjC,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;;;ACrOO,IAAM,kCAAkC,CAAC,SAAS,OAAO;AAIzD,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AACF;","names":[]}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@newgameplusinc/odyssey-asset-manager-sdk",
3
+ "version": "1.0.0",
4
+ "description": "Official SDK for the Odyssey Asset Manager backend",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsup",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "odyssey",
18
+ "asset-manager",
19
+ "sdk",
20
+ "upload",
21
+ "unreal"
22
+ ],
23
+ "dependencies": {
24
+ "axios": ">=1.0"
25
+ },
26
+ "devDependencies": {
27
+ "typescript": "^5",
28
+ "tsup": "^8",
29
+ "@types/node": "^20"
30
+ },
31
+ "publishConfig": {
32
+ "access": "restricted"
33
+ }
34
+ }