@alliumcloud/configurator-service 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/dist/index.js ADDED
@@ -0,0 +1,288 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var axios = require('axios');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var axios__default = /*#__PURE__*/_interopDefault(axios);
10
+
11
+ // src/core/http.ts
12
+
13
+ // src/errors.ts
14
+ function makeError(name, code, message, cause) {
15
+ const err = new Error(message);
16
+ err.name = name;
17
+ err.code = code;
18
+ if (cause !== void 0) err.cause = cause;
19
+ return err;
20
+ }
21
+ function createAuthError(message, cause) {
22
+ return makeError("AlliumAuthError", "AUTH_ERROR", message, cause);
23
+ }
24
+ function createRequestError(message, cause) {
25
+ return makeError("AlliumRequestError", "REQUEST_ERROR", message, cause);
26
+ }
27
+ function createValidationError(message, cause) {
28
+ return makeError(
29
+ "AlliumValidationError",
30
+ "VALIDATION_ERROR",
31
+ message,
32
+ cause
33
+ );
34
+ }
35
+ function createUploadError(message, cause) {
36
+ return makeError("AlliumUploadError", "UPLOAD_ERROR", message, cause);
37
+ }
38
+ function createConfigError(message, cause) {
39
+ return makeError("AlliumConfigError", "INVALID_CONFIG", message, cause);
40
+ }
41
+ function isAlliumError(err) {
42
+ return err instanceof Error && "code" in err;
43
+ }
44
+
45
+ // src/utils/debug.ts
46
+ var isDebugEnabled = () => {
47
+ if (typeof process !== "undefined" && process.env?.ALLIUM_DEBUG === "true") {
48
+ return true;
49
+ }
50
+ if (typeof window !== "undefined" && window.ALLIUM_DEBUG === true) {
51
+ return true;
52
+ }
53
+ return false;
54
+ };
55
+ var debugLog = (category, message, data) => {
56
+ if (!isDebugEnabled()) return;
57
+ (/* @__PURE__ */ new Date()).toISOString().slice(11, 23);
58
+ };
59
+
60
+ // src/core/http.ts
61
+ var PROD_BASE_URL = "https://api-gateway-dev.tenant-newgame.ord1.ingress.coreweave.cloud/configurator/api/v1";
62
+ function createHttpClient(config) {
63
+ const BASE_URL = config._devBaseUrl ?? PROD_BASE_URL;
64
+ if (!BASE_URL) {
65
+ throw createConfigError(
66
+ "[SDK] Base URL not configured. This SDK build is missing CONFIGURATOR_SERVICE_BASE_URL."
67
+ );
68
+ }
69
+ if (!config.apiKey || typeof config.apiKey !== "string" || !config.apiKey.trim()) {
70
+ throw createConfigError("[SDK] A valid apiKey is required.");
71
+ }
72
+ if (typeof config.accessTokenProvider !== "function")
73
+ throw createConfigError("[SDK] accessTokenProvider must be a function.");
74
+ const client = axios__default.default.create({
75
+ baseURL: BASE_URL,
76
+ timeout: config.timeout ?? 3e4,
77
+ headers: {
78
+ "Content-Type": "application/json",
79
+ "x-sdk-key": config.apiKey.trim(),
80
+ ...config.jwksUri?.trim() && { "x-jwks-uri": config.jwksUri.trim() }
81
+ }
82
+ });
83
+ client.interceptors.request.use(async (req) => {
84
+ const token = await config.accessTokenProvider();
85
+ if (token) {
86
+ req.headers["Authorization"] = `Bearer ${token}`;
87
+ }
88
+ debugLog(
89
+ "HTTP",
90
+ `\u2192 ${req.method?.toUpperCase()} ${req.url}`,
91
+ req.params ?? req.data
92
+ );
93
+ return req;
94
+ });
95
+ client.interceptors.response.use(
96
+ (res) => {
97
+ debugLog("HTTP", `\u2190 ${res.status} ${res.config.url}`);
98
+ return res;
99
+ },
100
+ (err) => {
101
+ const status = err.response?.status;
102
+ const message = err.response?.data?.message ?? err.message ?? "Unknown error";
103
+ const url = err.config?.url ?? "";
104
+ debugLog();
105
+ if (!status) {
106
+ throw createRequestError(
107
+ `[SDK] Network error reaching ${url}: ${message}`,
108
+ err
109
+ );
110
+ }
111
+ if (status === 401 || status === 403) {
112
+ throw createAuthError(
113
+ `[SDK] Authentication failed (${status}): ${message}`,
114
+ err
115
+ );
116
+ }
117
+ if (status === 422 || status === 400) {
118
+ throw createValidationError(
119
+ `[SDK] Validation error (${status}): ${message}`,
120
+ err
121
+ );
122
+ }
123
+ if (url.includes("/uploader")) {
124
+ throw createUploadError(
125
+ `[SDK] Upload operation failed (${status}): ${message}`,
126
+ err
127
+ );
128
+ }
129
+ throw createRequestError(
130
+ `[SDK] Request failed (${status}): ${message}`,
131
+ err
132
+ );
133
+ }
134
+ );
135
+ return client;
136
+ }
137
+
138
+ // src/modules/media.ts
139
+ function createMediaModule(http) {
140
+ async function addVideo(data) {
141
+ await http.post("/media/video", data);
142
+ debugLog();
143
+ }
144
+ async function updateVideo(spaceItemId, data) {
145
+ await http.patch(`/media/video/${spaceItemId}`, data);
146
+ debugLog();
147
+ }
148
+ async function addStream(data) {
149
+ await http.post("/media/stream", data);
150
+ debugLog();
151
+ }
152
+ async function updateStream(spaceItemId, data) {
153
+ await http.patch(`/media/stream/${spaceItemId}`, data);
154
+ debugLog();
155
+ }
156
+ async function addLink(data) {
157
+ await http.post("/media/link", data);
158
+ debugLog();
159
+ }
160
+ async function updateLink(spaceItemId, data) {
161
+ await http.patch(`/media/link/${spaceItemId}`, data);
162
+ debugLog();
163
+ }
164
+ return {
165
+ addVideo,
166
+ updateVideo,
167
+ addStream,
168
+ updateStream,
169
+ addLink,
170
+ updateLink
171
+ };
172
+ }
173
+
174
+ // src/modules/sketchfab.ts
175
+ function createSketchfabModule(http) {
176
+ async function addObject(data) {
177
+ await http.post("/sketchfab/object", data);
178
+ debugLog();
179
+ }
180
+ async function updateObject(spaceItemId, data) {
181
+ await http.patch(`/sketchfab/${spaceItemId}`, data);
182
+ debugLog();
183
+ }
184
+ return { addObject, updateObject };
185
+ }
186
+
187
+ // src/modules/transform.ts
188
+ function createTransformModule(http) {
189
+ async function updatePosition(spaceItemId, data) {
190
+ await http.patch(`/transform/${spaceItemId}/position`, data);
191
+ debugLog();
192
+ }
193
+ async function updateRotation(spaceItemId, data) {
194
+ await http.patch(`/transform/${spaceItemId}/rotation`, data);
195
+ debugLog();
196
+ }
197
+ async function updateScale(spaceItemId, data) {
198
+ await http.patch(`/transform/${spaceItemId}/scale`, data);
199
+ debugLog();
200
+ }
201
+ async function snapToGround(spaceItemId, data) {
202
+ await http.post(`/transform/${spaceItemId}/snap`, data);
203
+ debugLog();
204
+ }
205
+ return { updatePosition, updateRotation, updateScale, snapToGround };
206
+ }
207
+
208
+ // src/modules/layer.ts
209
+ function createLayerModule(http) {
210
+ async function lockItem(spaceItemId, data) {
211
+ await http.patch(`/layer/${spaceItemId}/lock`, data);
212
+ debugLog();
213
+ }
214
+ async function renameItem(spaceItemId, data) {
215
+ await http.patch(`/layer/${spaceItemId}/rename`, data);
216
+ debugLog();
217
+ }
218
+ async function deleteItem(spaceItemId, data) {
219
+ await http.delete(`/layer/${spaceItemId}`, { data });
220
+ debugLog();
221
+ }
222
+ async function deleteAll(data) {
223
+ await http.delete("/layer", { data });
224
+ debugLog();
225
+ }
226
+ return { lockItem, renameItem, deleteItem, deleteAll };
227
+ }
228
+
229
+ // src/modules/configuratorItems.ts
230
+ function createConfiguratorItemsModule(http) {
231
+ async function create(data) {
232
+ await http.post("/configurator_items", data);
233
+ debugLog();
234
+ }
235
+ async function updateState(spaceItemId, data) {
236
+ await http.patch(`/configurator_items/${spaceItemId}/state`, data);
237
+ debugLog();
238
+ }
239
+ return { create, updateState };
240
+ }
241
+
242
+ // src/modules/configuratorObjects.ts
243
+ function createConfiguratorObjectsModule(http) {
244
+ async function create(data) {
245
+ await http.post("/configurator_objects", data);
246
+ debugLog();
247
+ }
248
+ async function updateConfiguration(spaceItemId, data) {
249
+ await http.patch(
250
+ `/configurator_objects/${spaceItemId}/configuration`,
251
+ data
252
+ );
253
+ debugLog();
254
+ }
255
+ return { create, updateConfiguration };
256
+ }
257
+
258
+ // src/index.ts
259
+ function createConfiguratorSDK(config) {
260
+ const http = createHttpClient(config);
261
+ debugLog("ConfiguratorSDK", "Initialized", {
262
+ timeout: config.timeout ?? 3e4
263
+ });
264
+ return {
265
+ media: createMediaModule(http),
266
+ sketchfab: createSketchfabModule(http),
267
+ transform: createTransformModule(http),
268
+ layer: createLayerModule(http),
269
+ configuratorItems: createConfiguratorItemsModule(http),
270
+ configuratorObjects: createConfiguratorObjectsModule(http)
271
+ };
272
+ }
273
+ var ConfiguratorSDK = {
274
+ /**
275
+ * Create a new SDK client instance.
276
+ * @param config SDK configuration — apiKey is required, timeout is optional.
277
+ */
278
+ create(config) {
279
+ return createConfiguratorSDK(config);
280
+ }
281
+ };
282
+ var index_default = ConfiguratorSDK;
283
+
284
+ exports.createConfiguratorSDK = createConfiguratorSDK;
285
+ exports.default = index_default;
286
+ exports.isAlliumError = isAlliumError;
287
+ //# sourceMappingURL=index.js.map
288
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/utils/debug.ts","../src/core/http.ts","../src/modules/media.ts","../src/modules/sketchfab.ts","../src/modules/transform.ts","../src/modules/layer.ts","../src/modules/configuratorItems.ts","../src/modules/configuratorObjects.ts","../src/index.ts"],"names":["axios"],"mappings":";;;;;;;;;;;;;AAQA,SAAS,SAAA,CACP,IAAA,EACA,IAAA,EACA,OAAA,EACA,KAAA,EACa;AACb,EAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,OAAO,CAAA;AAC7B,EAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AACX,EAAC,IAAY,IAAA,GAAO,IAAA;AACpB,EAAA,IAAI,KAAA,KAAU,MAAA,EAAY,GAAA,CAAY,KAAA,GAAQ,KAAA;AAC9C,EAAA,OAAO,GAAA;AACT;AAYO,SAAS,eAAA,CACd,SACA,KAAA,EACa;AACb,EAAA,OAAO,SAAA,CAAU,iBAAA,EAAmB,YAAA,EAAc,OAAA,EAAS,KAAK,CAAA;AAClE;AAGO,SAAS,kBAAA,CACd,SACA,KAAA,EACa;AACb,EAAA,OAAO,SAAA,CAAU,oBAAA,EAAsB,eAAA,EAAiB,OAAA,EAAS,KAAK,CAAA;AACxE;AAGO,SAAS,qBAAA,CACd,SACA,KAAA,EACa;AACb,EAAA,OAAO,SAAA;AAAA,IACL,uBAAA;AAAA,IACA,kBAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,SAAS,iBAAA,CACd,SACA,KAAA,EACa;AACb,EAAA,OAAO,SAAA,CAAU,mBAAA,EAAqB,cAAA,EAAgB,OAAA,EAAS,KAAK,CAAA;AACtE;AAGO,SAAS,iBAAA,CACd,SACA,KAAA,EACa;AACb,EAAA,OAAO,SAAA,CAAU,mBAAA,EAAqB,gBAAA,EAAkB,OAAA,EAAS,KAAK,CAAA;AACxE;AAGO,SAAS,cAAc,GAAA,EAAkC;AAC9D,EAAA,OAAO,GAAA,YAAe,SAAS,MAAA,IAAU,GAAA;AAC3C;;;ACpEO,IAAM,iBAAiB,MAAe;AAE3C,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK,iBAAiB,MAAA,EAAQ;AAC1E,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,iBAAiB,IAAA,EAAM;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT,CAAA;AAEO,IAAM,QAAA,GAAW,CACtB,QAAA,EACA,OAAA,EACA,IAAA,KACS;AACT,EAAA,IAAI,CAAC,gBAAe,EAAG;AACvB,EAAM,qBAAgB,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,IAAI,EAAE;AAIzD,CAAA;;;ACNA,IAAM,aAAA,GAAwB,yFAAA;AAIvB,SAAS,iBACd,MAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,OAAO,WAAA,IAAe,aAAA;AACvC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,iBAAA;AAAA,MACJ;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IACE,CAAC,MAAA,CAAO,MAAA,IACR,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,IACzB,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,EAAK,EACpB;AACA,IAAA,MAAM,kBAAkB,mCAAmC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,OAAO,OAAO,mBAAA,KAAwB,UAAA;AACxC,IAAA,MAAM,kBAAkB,+CAA+C,CAAA;AAEzE,EAAA,MAAM,MAAA,GAASA,uBAAM,MAAA,CAAO;AAAA,IAC1B,OAAA,EAAS,QAAA;AAAA,IACT,OAAA,EAAS,OAAO,OAAA,IAAW,GAAA;AAAA,IAC3B,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,kBAAA;AAAA,MAChB,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,IAAA,EAAK;AAAA,MAChC,GAAI,MAAA,CAAO,OAAA,EAAS,IAAA,EAAK,IAAK,EAAE,YAAA,EAAc,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK;AAAE;AACtE,GACD,CAAA;AAGD,EAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,OAAO,GAAA,KAAQ;AAC7C,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,mBAAA,EAAoB;AAC/C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,GAAA,CAAI,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,IAChD;AACA,IAAA,QAAA;AAAA,MACE,MAAA;AAAA,MACA,UAAK,GAAA,CAAI,MAAA,EAAQ,aAAa,CAAA,CAAA,EAAI,IAAI,GAAG,CAAA,CAAA;AAAA,MACzC,GAAA,CAAI,UAAU,GAAA,CAAI;AAAA,KACpB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,aAAa,QAAA,CAAS,GAAA;AAAA,IAC3B,CAAC,GAAA,KAAQ;AACP,MAAA,QAAA,CAAS,MAAA,EAAQ,UAAK,GAAA,CAAI,MAAM,IAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,CAAA;AACpD,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,GAAA,KAAoB;AACnB,MAAA,MAAM,MAAA,GAAS,IAAI,QAAA,EAAU,MAAA;AAC7B,MAAA,MAAM,UACH,GAAA,CAAI,QAAA,EAAU,IAAA,EAAc,OAAA,IAAW,IAAI,OAAA,IAAW,eAAA;AACzD,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,EAAQ,GAAA,IAAO,EAAA;AAE/B,MAAA,QAAA,CAAiE,CAAA;AAEjE,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,QAAA,MAAM,kBAAA;AAAA,UACJ,CAAA,6BAAA,EAAgC,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAAA,UAC/C;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,QAAA,MAAM,eAAA;AAAA,UACJ,CAAA,6BAAA,EAAgC,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA;AAAA,UACnD;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,QAAA,MAAM,qBAAA;AAAA,UACJ,CAAA,wBAAA,EAA2B,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA;AAAA,UAC9C;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC7B,QAAA,MAAM,iBAAA;AAAA,UACJ,CAAA,+BAAA,EAAkC,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA;AAAA,UACrD;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,kBAAA;AAAA,QACJ,CAAA,sBAAA,EAAyB,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA;AAAA,QAC5C;AAAA,OACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACtGO,SAAS,kBAAkB,IAAA,EAAkC;AAClE,EAAA,eAAe,SAAS,IAAA,EAAuC;AAC7D,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,IAAI,CAAA;AACpC,IAAA,QAAA,CAAkC,CAAA;AAAA,EACpC;AAEA,EAAA,eAAe,WAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,aAAA,EAAgB,WAAW,IAAI,IAAI,CAAA;AACpD,IAAA,QAAA,CAAqC,CAAA;AAAA,EACvC;AAEA,EAAA,eAAe,UAAU,IAAA,EAAwC;AAC/D,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,IAAI,CAAA;AACrC,IAAA,QAAA,CAAmC,CAAA;AAAA,EACrC;AAEA,EAAA,eAAe,YAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,cAAA,EAAiB,WAAW,IAAI,IAAI,CAAA;AACrD,IAAA,QAAA,CAAsC,CAAA;AAAA,EACxC;AAEA,EAAA,eAAe,QAAQ,IAAA,EAAsC;AAC3D,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,IAAI,CAAA;AACnC,IAAA,QAAA,CAAiC,CAAA;AAAA,EACnC;AAEA,EAAA,eAAe,UAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,YAAA,EAAe,WAAW,IAAI,IAAI,CAAA;AACnD,IAAA,QAAA,CAAoC,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACrDO,SAAS,sBAAsB,IAAA,EAAsC;AAC1E,EAAA,eAAe,UAAU,IAAA,EAAiD;AACxE,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,IAAI,CAAA;AACzC,IAAA,QAAA,CAAuC,CAAA;AAAA,EACzC;AAEA,EAAA,eAAe,YAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,WAAA,EAAc,WAAW,IAAI,IAAI,CAAA;AAClD,IAAA,QAAA,CAA0C,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AACnC;;;ACdO,SAAS,sBAAsB,IAAA,EAAsC;AAC1E,EAAA,eAAe,cAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,WAAA,EAAc,WAAW,aAAa,IAAI,CAAA;AAC3D,IAAA,QAAA,CAA4C,CAAA;AAAA,EAC9C;AAEA,EAAA,eAAe,cAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,WAAA,EAAc,WAAW,aAAa,IAAI,CAAA;AAC3D,IAAA,QAAA,CAA4C,CAAA;AAAA,EAC9C;AAEA,EAAA,eAAe,WAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,WAAA,EAAc,WAAW,UAAU,IAAI,CAAA;AACxD,IAAA,QAAA,CAAyC,CAAA;AAAA,EAC3C;AAEA,EAAA,eAAe,YAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,CAAA,WAAA,EAAc,WAAW,SAAS,IAAI,CAAA;AACtD,IAAA,QAAA,CAA0C,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,EAAE,cAAA,EAAgB,cAAA,EAAgB,WAAA,EAAa,YAAA,EAAa;AACrE;;;AClCO,SAAS,kBAAkB,IAAA,EAAkC;AAClE,EAAA,eAAe,QAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,OAAA,EAAU,WAAW,SAAS,IAAI,CAAA;AACnD,IAAA,QAAA,CAAkC,CAAA;AAAA,EACpC;AAEA,EAAA,eAAe,UAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,OAAA,EAAU,WAAW,WAAW,IAAI,CAAA;AACrD,IAAA,QAAA,CAAoC,CAAA;AAAA,EACtC;AAEA,EAAA,eAAe,UAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,KAAK,MAAA,CAAO,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA,EAAI,EAAE,MAAM,CAAA;AACnD,IAAA,QAAA,CAAoC,CAAA;AAAA,EACtC;AAEA,EAAA,eAAe,UAAU,IAAA,EAA+C;AACtE,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AACpC,IAAA,QAAA,CAAmC,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,SAAA,EAAU;AACvD;;;AChCO,SAAS,8BACd,IAAA,EACyB;AACzB,EAAA,eAAe,OAAO,IAAA,EAAkD;AACtE,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,qBAAA,EAAuB,IAAI,CAAA;AAC3C,IAAA,QAAA,CAA4C,CAAA;AAAA,EAC9C;AAEA,EAAA,eAAe,WAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,oBAAA,EAAuB,WAAW,UAAU,IAAI,CAAA;AACjE,IAAA,QAAA,CAAiD,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B;;;ACjBO,SAAS,gCACd,IAAA,EAC2B;AAC3B,EAAA,eAAe,OAAO,IAAA,EAAoD;AACxE,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,uBAAA,EAAyB,IAAI,CAAA;AAC7C,IAAA,QAAA,CAA8C,CAAA;AAAA,EAChD;AAEA,EAAA,eAAe,mBAAA,CACb,aACA,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,KAAA;AAAA,MACT,yBAAyB,WAAW,CAAA,cAAA,CAAA;AAAA,MACpC;AAAA,KACF;AACA,IAAA,QAAA,CAA2D,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,EAAE,QAAQ,mBAAA,EAAoB;AACvC;;;ACVO,SAAS,sBACd,MAAA,EACuB;AACvB,EAAA,MAAM,IAAA,GAAO,iBAAiB,MAAM,CAAA;AAEpC,EAAA,QAAA,CAAS,mBAAmB,aAAA,EAAe;AAAA,IACzC,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,GAC5B,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,kBAAkB,IAAI,CAAA;AAAA,IAC7B,SAAA,EAAW,sBAAsB,IAAI,CAAA;AAAA,IACrC,SAAA,EAAW,sBAAsB,IAAI,CAAA;AAAA,IACrC,KAAA,EAAO,kBAAkB,IAAI,CAAA;AAAA,IAC7B,iBAAA,EAAmB,8BAA8B,IAAI,CAAA;AAAA,IACrD,mBAAA,EAAqB,gCAAgC,IAAI;AAAA,GAC3D;AACF;AAIA,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtB,OAAO,MAAA,EAA6D;AAClE,IAAA,OAAO,sBAAsB,MAAM,CAAA;AAAA,EACrC;AACF,CAAA;AAEA,IAAO,aAAA,GAAQ","file":"index.js","sourcesContent":["/**\n * SDK Error factories.\n */\n\nexport interface AlliumError extends Error {\n readonly code: string;\n}\n\nfunction makeError(\n name: string,\n code: string,\n message: string,\n cause?: unknown,\n): AlliumError {\n const err = new Error(message) as AlliumError;\n err.name = name;\n (err as any).code = code;\n if (cause !== undefined) (err as any).cause = cause;\n return err;\n}\n\n/** Generic SDK error — use when no specific category fits */\nexport function createSDKError(\n message: string,\n code = \"SDK_ERROR\",\n cause?: unknown,\n): AlliumError {\n return makeError(\"AlliumSDKError\", code, message, cause);\n}\n\n/** Thrown when the API key is missing, invalid, or rejected by the server */\nexport function createAuthError(\n message: string,\n cause?: unknown,\n): AlliumError {\n return makeError(\"AlliumAuthError\", \"AUTH_ERROR\", message, cause);\n}\n\n/** Thrown when the HTTP request itself fails (network, timeout, 5xx) */\nexport function createRequestError(\n message: string,\n cause?: unknown,\n): AlliumError {\n return makeError(\"AlliumRequestError\", \"REQUEST_ERROR\", message, cause);\n}\n\n/** Thrown when the server returns a 4xx for bad input data */\nexport function createValidationError(\n message: string,\n cause?: unknown,\n): AlliumError {\n return makeError(\n \"AlliumValidationError\",\n \"VALIDATION_ERROR\",\n message,\n cause,\n );\n}\n\n/** Thrown for upload-specific failures (initiate, complete, abort) */\nexport function createUploadError(\n message: string,\n cause?: unknown,\n): AlliumError {\n return makeError(\"AlliumUploadError\", \"UPLOAD_ERROR\", message, cause);\n}\n\n/** Thrown when SDK_BASE_URL or apiKey is not configured correctly */\nexport function createConfigError(\n message: string,\n cause?: unknown,\n): AlliumError {\n return makeError(\"AlliumConfigError\", \"INVALID_CONFIG\", message, cause);\n}\n\n/** Type guard — works for all Allium error factories */\nexport function isAlliumError(err: unknown): err is AlliumError {\n return err instanceof Error && \"code\" in err;\n}\n","/**\n * Centralised debug logging utility.\n */\n\ndeclare global {\n interface Window {\n ALLIUM_DEBUG?: boolean;\n }\n}\n\nexport const isDebugEnabled = (): boolean => {\n // Node.js environment\n if (typeof process !== \"undefined\" && process.env?.ALLIUM_DEBUG === \"true\") {\n return true;\n }\n // Browser environment\n if (typeof window !== \"undefined\" && window.ALLIUM_DEBUG === true) {\n return true;\n }\n return false;\n};\n\nexport const debugLog = (\n category: string,\n message: string,\n data?: unknown,\n): void => {\n if (!isDebugEnabled()) return;\n const timestamp = new Date().toISOString().slice(11, 23);\n if (data !== undefined) {\n } else {\n }\n};\n","/**\n * HTTP client factory.\n *\n * Creates and configures the axios instance used by all modules.\n * Handles:\n * - Base URL (baked in at build time)\n * - API key injection on every request via header\n * - Timeout\n * - Response unwrapping (your backend wraps all responses in { data: ... })\n * - Error normalization into AlliumError types\n */\n\nimport axios, { AxiosInstance, AxiosError } from \"axios\";\nimport { ConfiguratorServiceSDKConfig } from \"../types/common\";\nimport {\n createAuthError,\n createConfigError,\n createRequestError,\n createValidationError,\n createUploadError,\n} from \"../errors\";\nimport { debugLog } from \"../utils\";\n\n// ─── Build-time URL ───────────────────────────────────────────────────────────\n\ndeclare const process: { env: { CONFIGURATOR_SERVICE_BASE_URL: string } };\nconst PROD_BASE_URL: string = process.env.CONFIGURATOR_SERVICE_BASE_URL;\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\nexport function createHttpClient(\n config: ConfiguratorServiceSDKConfig,\n): AxiosInstance {\n const BASE_URL = config._devBaseUrl ?? PROD_BASE_URL;\n if (!BASE_URL) {\n throw createConfigError(\n \"[SDK] Base URL not configured. This SDK build is missing CONFIGURATOR_SERVICE_BASE_URL.\",\n );\n }\n\n if (\n !config.apiKey ||\n typeof config.apiKey !== \"string\" ||\n !config.apiKey.trim()\n ) {\n throw createConfigError(\"[SDK] A valid apiKey is required.\");\n }\n\n if (typeof config.accessTokenProvider !== \"function\")\n throw createConfigError(\"[SDK] accessTokenProvider must be a function.\");\n\n const client = axios.create({\n baseURL: BASE_URL,\n timeout: config.timeout ?? 30_000,\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-sdk-key\": config.apiKey.trim(),\n ...(config.jwksUri?.trim() && { \"x-jwks-uri\": config.jwksUri.trim() }),\n },\n });\n\n // ── Request interceptor — debug logging ───────────────────────────────────\n client.interceptors.request.use(async (req) => {\n const token = await config.accessTokenProvider();\n if (token) {\n req.headers[\"Authorization\"] = `Bearer ${token}`;\n }\n debugLog(\n \"HTTP\",\n `→ ${req.method?.toUpperCase()} ${req.url}`,\n req.params ?? req.data,\n );\n return req;\n });\n\n // ── Response interceptor — unwrap + normalize errors ──────────────────────\n client.interceptors.response.use(\n (res) => {\n debugLog(\"HTTP\", `← ${res.status} ${res.config.url}`);\n return res;\n },\n (err: AxiosError) => {\n const status = err.response?.status;\n const message =\n (err.response?.data as any)?.message ?? err.message ?? \"Unknown error\";\n const url = err.config?.url ?? \"\";\n\n debugLog(\"HTTP\", `← ERROR ${status ?? \"network\"} ${url}`, message);\n\n if (!status) {\n // Network error — no response received at all\n throw createRequestError(\n `[SDK] Network error reaching ${url}: ${message}`,\n err,\n );\n }\n\n if (status === 401 || status === 403) {\n throw createAuthError(\n `[SDK] Authentication failed (${status}): ${message}`,\n err,\n );\n }\n\n if (status === 422 || status === 400) {\n throw createValidationError(\n `[SDK] Validation error (${status}): ${message}`,\n err,\n );\n }\n\n if (url.includes(\"/uploader\")) {\n throw createUploadError(\n `[SDK] Upload operation failed (${status}): ${message}`,\n err,\n );\n }\n\n throw createRequestError(\n `[SDK] Request failed (${status}): ${message}`,\n err,\n );\n },\n );\n\n return client;\n}\n","/**\n * Media Module - Operations\n */\n\nimport { AxiosInstance } from \"axios\";\nimport {\n CreateLinkInput,\n CreateStreamInput,\n CreateVideoInput,\n UpdateLinkInput,\n UpdateStreamInput,\n UpdateVideoInput,\n} from \"../types/media\";\nimport { debugLog } from \"../utils\";\n\nexport interface MediaHandle {\n addVideo(data: CreateVideoInput): Promise<void>;\n updateVideo(spaceItemId: string, data: UpdateVideoInput): Promise<void>;\n addStream(data: CreateStreamInput): Promise<void>;\n updateStream(spaceItemId: string, data: UpdateStreamInput): Promise<void>;\n addLink(data: CreateLinkInput): Promise<void>;\n updateLink(spaceItemId: string, data: UpdateLinkInput): Promise<void>;\n}\n\nexport function createMediaModule(http: AxiosInstance): MediaHandle {\n async function addVideo(data: CreateVideoInput): Promise<void> {\n await http.post(\"/media/video\", data);\n debugLog(\"Media\", \"addVideo\", data);\n }\n\n async function updateVideo(\n spaceItemId: string,\n data: UpdateVideoInput,\n ): Promise<void> {\n await http.patch(`/media/video/${spaceItemId}`, data);\n debugLog(\"Media\", \"updateVideo\", data);\n }\n\n async function addStream(data: CreateStreamInput): Promise<void> {\n await http.post(\"/media/stream\", data);\n debugLog(\"Media\", \"addStream\", data);\n }\n\n async function updateStream(\n spaceItemId: string,\n data: UpdateStreamInput,\n ): Promise<void> {\n await http.patch(`/media/stream/${spaceItemId}`, data);\n debugLog(\"Media\", \"updateStream\", data);\n }\n\n async function addLink(data: CreateLinkInput): Promise<void> {\n await http.post(\"/media/link\", data);\n debugLog(\"Media\", \"addLink\", data);\n }\n\n async function updateLink(\n spaceItemId: string,\n data: UpdateLinkInput,\n ): Promise<void> {\n await http.patch(`/media/link/${spaceItemId}`, data);\n debugLog(\"Media\", \"updateLink\", data);\n }\n\n return {\n addVideo,\n updateVideo,\n addStream,\n updateStream,\n addLink,\n updateLink,\n };\n}\n","/**\n * Sketchfab Module - 3D Object Operations\n */\n\nimport { AxiosInstance } from \"axios\";\nimport {\n CreateSketchfabObjectInput,\n UpdateSketchfabObjectInput,\n} from \"../types/sketchfab\";\nimport { debugLog } from \"../utils\";\n\nexport interface SketchfabHandle {\n addObject(data: CreateSketchfabObjectInput): Promise<void>;\n updateObject(\n spaceItemId: string,\n data: UpdateSketchfabObjectInput,\n ): Promise<void>;\n}\n\nexport function createSketchfabModule(http: AxiosInstance): SketchfabHandle {\n async function addObject(data: CreateSketchfabObjectInput): Promise<void> {\n await http.post(\"/sketchfab/object\", data);\n debugLog(\"Sketchfab\", \"addObject\", data);\n }\n\n async function updateObject(\n spaceItemId: string,\n data: UpdateSketchfabObjectInput,\n ): Promise<void> {\n await http.patch(`/sketchfab/${spaceItemId}`, data);\n debugLog(\"Sketchfab\", \"updateObject\", data);\n }\n\n return { addObject, updateObject };\n}\n","/**\n * Transform Module - Position, Rotation, Scale Operations\n */\n\nimport { AxiosInstance } from \"axios\";\nimport {\n UpdatePositionInput,\n UpdateRotationInput,\n UpdateScaleInput,\n SnapToGroundInput,\n} from \"../types/transform\";\nimport { debugLog } from \"../utils\";\n\nexport interface TransformHandle {\n updatePosition(spaceItemId: string, data: UpdatePositionInput): Promise<void>;\n updateRotation(spaceItemId: string, data: UpdateRotationInput): Promise<void>;\n updateScale(spaceItemId: string, data: UpdateScaleInput): Promise<void>;\n snapToGround(spaceItemId: string, data: SnapToGroundInput): Promise<void>;\n}\n\nexport function createTransformModule(http: AxiosInstance): TransformHandle {\n async function updatePosition(\n spaceItemId: string,\n data: UpdatePositionInput,\n ): Promise<void> {\n await http.patch(`/transform/${spaceItemId}/position`, data);\n debugLog(\"Transform\", \"updatePosition\", data);\n }\n\n async function updateRotation(\n spaceItemId: string,\n data: UpdateRotationInput,\n ): Promise<void> {\n await http.patch(`/transform/${spaceItemId}/rotation`, data);\n debugLog(\"Transform\", \"updateRotation\", data);\n }\n\n async function updateScale(\n spaceItemId: string,\n data: UpdateScaleInput,\n ): Promise<void> {\n await http.patch(`/transform/${spaceItemId}/scale`, data);\n debugLog(\"Transform\", \"updateScale\", data);\n }\n\n async function snapToGround(\n spaceItemId: string,\n data: SnapToGroundInput,\n ): Promise<void> {\n await http.post(`/transform/${spaceItemId}/snap`, data);\n debugLog(\"Transform\", \"snapToGround\", data);\n }\n\n return { updatePosition, updateRotation, updateScale, snapToGround };\n}\n","/**\n * Layer Module - Lock, Rename, Delete Operations\n */\n\nimport { AxiosInstance } from \"axios\";\nimport {\n LockLayerItemInput,\n RenameLayerItemInput,\n DeleteLayerItemInput,\n DeleteAllLayerItemsInput,\n} from \"../types/layer\";\nimport { debugLog } from \"../utils\";\n\nexport interface LayerHandle {\n lockItem(spaceItemId: string, data: LockLayerItemInput): Promise<void>;\n renameItem(spaceItemId: string, data: RenameLayerItemInput): Promise<void>;\n deleteItem(spaceItemId: string, data: DeleteLayerItemInput): Promise<void>;\n deleteAll(data: DeleteAllLayerItemsInput): Promise<void>;\n}\n\nexport function createLayerModule(http: AxiosInstance): LayerHandle {\n async function lockItem(\n spaceItemId: string,\n data: LockLayerItemInput,\n ): Promise<void> {\n await http.patch(`/layer/${spaceItemId}/lock`, data);\n debugLog(\"Layer\", \"lockItem\", data);\n }\n\n async function renameItem(\n spaceItemId: string,\n data: RenameLayerItemInput,\n ): Promise<void> {\n await http.patch(`/layer/${spaceItemId}/rename`, data);\n debugLog(\"Layer\", \"renameItem\", data);\n }\n\n async function deleteItem(\n spaceItemId: string,\n data: DeleteLayerItemInput,\n ): Promise<void> {\n await http.delete(`/layer/${spaceItemId}`, { data });\n debugLog(\"Layer\", \"deleteItem\", data);\n }\n\n async function deleteAll(data: DeleteAllLayerItemsInput): Promise<void> {\n await http.delete(\"/layer\", { data });\n debugLog(\"Layer\", \"deleteAll\", data);\n }\n\n return { lockItem, renameItem, deleteItem, deleteAll };\n}\n","/**\n * Configurator Items Module - Level-wide property operations\n */\n\nimport { AxiosInstance } from \"axios\";\nimport {\n CreateConfiguratorItemInput,\n UpdateConfiguratorItemStateInput,\n} from \"../types/configuratorItems\";\nimport { debugLog } from \"../utils\";\n\nexport interface ConfiguratorItemsHandle {\n create(data: CreateConfiguratorItemInput): Promise<void>;\n updateState(\n spaceItemId: string,\n data: UpdateConfiguratorItemStateInput,\n ): Promise<void>;\n}\n\nexport function createConfiguratorItemsModule(\n http: AxiosInstance,\n): ConfiguratorItemsHandle {\n async function create(data: CreateConfiguratorItemInput): Promise<void> {\n await http.post(\"/configurator_items\", data);\n debugLog(\"ConfiguratorItems\", \"create\", data);\n }\n\n async function updateState(\n spaceItemId: string,\n data: UpdateConfiguratorItemStateInput,\n ): Promise<void> {\n await http.patch(`/configurator_items/${spaceItemId}/state`, data);\n debugLog(\"ConfiguratorItems\", \"updateState\", data);\n }\n\n return { create, updateState };\n}\n","/**\n * Configurator Objects Module - UE Actor placement and configuration\n */\n\nimport { AxiosInstance } from \"axios\";\nimport {\n CreateConfiguratorObjectInput,\n UpdateConfiguratorObjectConfigInput,\n} from \"../types/configuratorObjects\";\nimport { debugLog } from \"../utils\";\n\nexport interface ConfiguratorObjectsHandle {\n create(data: CreateConfiguratorObjectInput): Promise<void>;\n updateConfiguration(\n spaceItemId: string,\n data: UpdateConfiguratorObjectConfigInput,\n ): Promise<void>;\n}\n\nexport function createConfiguratorObjectsModule(\n http: AxiosInstance,\n): ConfiguratorObjectsHandle {\n async function create(data: CreateConfiguratorObjectInput): Promise<void> {\n await http.post(\"/configurator_objects\", data);\n debugLog(\"ConfiguratorObjects\", \"create\", data);\n }\n\n async function updateConfiguration(\n spaceItemId: string,\n data: UpdateConfiguratorObjectConfigInput,\n ): Promise<void> {\n await http.patch(\n `/configurator_objects/${spaceItemId}/configuration`,\n data,\n );\n debugLog(\"ConfiguratorObjects\", \"updateConfiguration\", data);\n }\n\n return { create, updateConfiguration };\n}\n","import { createHttpClient } from \"./core/http\";\nimport { createMediaModule, MediaHandle } from \"./modules/media\";\nimport { createSketchfabModule, SketchfabHandle } from \"./modules/sketchfab\";\nimport { createTransformModule, TransformHandle } from \"./modules/transform\";\nimport { createLayerModule, LayerHandle } from \"./modules/layer\";\nimport {\n createConfiguratorItemsModule,\n ConfiguratorItemsHandle,\n} from \"./modules/configuratorItems\";\nimport {\n createConfiguratorObjectsModule,\n ConfiguratorObjectsHandle,\n} from \"./modules/configuratorObjects\";\nimport { ConfiguratorServiceSDKConfig } from \"./types/common\";\nimport { debugLog } from \"./utils\";\n\n// ─── Public handle interface ──────────────────────────────────────────────────\n\nexport interface ConfiguratorSDKHandle {\n media: MediaHandle;\n sketchfab: SketchfabHandle;\n transform: TransformHandle;\n layer: LayerHandle;\n configuratorItems: ConfiguratorItemsHandle;\n configuratorObjects: ConfiguratorObjectsHandle;\n}\n\n// ─── Factory function ─────────────────────────────────────────────────────────\n\nexport function createConfiguratorSDK(\n config: ConfiguratorServiceSDKConfig,\n): ConfiguratorSDKHandle {\n const http = createHttpClient(config);\n\n debugLog(\"ConfiguratorSDK\", \"Initialized\", {\n timeout: config.timeout ?? 30_000,\n });\n\n return {\n media: createMediaModule(http),\n sketchfab: createSketchfabModule(http),\n transform: createTransformModule(http),\n layer: createLayerModule(http),\n configuratorItems: createConfiguratorItemsModule(http),\n configuratorObjects: createConfiguratorObjectsModule(http),\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst ConfiguratorSDK = {\n /**\n * Create a new SDK client instance.\n * @param config SDK configuration — apiKey is required, timeout is optional.\n */\n create(config: ConfiguratorServiceSDKConfig): ConfiguratorSDKHandle {\n return createConfiguratorSDK(config);\n },\n} as const;\n\nexport default ConfiguratorSDK;\n\n// ─── Type exports ─────────────────────────────────────────────────────────────\n\nexport type { ConfiguratorServiceSDKConfig } from \"./types/common\";\n\n// Media\nexport type {\n CreateVideoInput,\n UpdateVideoInput,\n CreateLinkInput,\n UpdateLinkInput,\n CreateStreamInput,\n UpdateStreamInput,\n} from \"./types/media\";\n\n// Sketchfab\nexport type {\n CreateSketchfabObjectInput,\n UpdateSketchfabObjectInput,\n} from \"./types/sketchfab\";\n\n// Transform\nexport type {\n UpdatePositionInput,\n UpdateRotationInput,\n UpdateScaleInput,\n SnapToGroundInput,\n} from \"./types/transform\";\n\n// Layer\nexport type {\n LockLayerItemInput,\n RenameLayerItemInput,\n DeleteLayerItemInput,\n DeleteAllLayerItemsInput,\n} from \"./types/layer\";\n\n// Configurator\nexport type {\n CreateConfiguratorItemInput,\n UpdateConfiguratorItemStateInput,\n} from \"./types/configuratorItems\";\n\nexport type {\n CreateConfiguratorObjectInput,\n UpdateConfiguratorObjectConfigInput,\n} from \"./types/configuratorObjects\";\n\nexport { isAlliumError } from \"./errors\";\nexport type { AlliumError } from \"./errors\";\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,278 @@
1
+ import axios from 'axios';
2
+
3
+ // src/core/http.ts
4
+
5
+ // src/errors.ts
6
+ function makeError(name, code, message, cause) {
7
+ const err = new Error(message);
8
+ err.name = name;
9
+ err.code = code;
10
+ if (cause !== void 0) err.cause = cause;
11
+ return err;
12
+ }
13
+ function createAuthError(message, cause) {
14
+ return makeError("AlliumAuthError", "AUTH_ERROR", message, cause);
15
+ }
16
+ function createRequestError(message, cause) {
17
+ return makeError("AlliumRequestError", "REQUEST_ERROR", message, cause);
18
+ }
19
+ function createValidationError(message, cause) {
20
+ return makeError(
21
+ "AlliumValidationError",
22
+ "VALIDATION_ERROR",
23
+ message,
24
+ cause
25
+ );
26
+ }
27
+ function createUploadError(message, cause) {
28
+ return makeError("AlliumUploadError", "UPLOAD_ERROR", message, cause);
29
+ }
30
+ function createConfigError(message, cause) {
31
+ return makeError("AlliumConfigError", "INVALID_CONFIG", message, cause);
32
+ }
33
+ function isAlliumError(err) {
34
+ return err instanceof Error && "code" in err;
35
+ }
36
+
37
+ // src/utils/debug.ts
38
+ var isDebugEnabled = () => {
39
+ if (typeof process !== "undefined" && process.env?.ALLIUM_DEBUG === "true") {
40
+ return true;
41
+ }
42
+ if (typeof window !== "undefined" && window.ALLIUM_DEBUG === true) {
43
+ return true;
44
+ }
45
+ return false;
46
+ };
47
+ var debugLog = (category, message, data) => {
48
+ if (!isDebugEnabled()) return;
49
+ (/* @__PURE__ */ new Date()).toISOString().slice(11, 23);
50
+ };
51
+
52
+ // src/core/http.ts
53
+ var PROD_BASE_URL = "https://api-gateway-dev.tenant-newgame.ord1.ingress.coreweave.cloud/configurator/api/v1";
54
+ function createHttpClient(config) {
55
+ const BASE_URL = config._devBaseUrl ?? PROD_BASE_URL;
56
+ if (!BASE_URL) {
57
+ throw createConfigError(
58
+ "[SDK] Base URL not configured. This SDK build is missing CONFIGURATOR_SERVICE_BASE_URL."
59
+ );
60
+ }
61
+ if (!config.apiKey || typeof config.apiKey !== "string" || !config.apiKey.trim()) {
62
+ throw createConfigError("[SDK] A valid apiKey is required.");
63
+ }
64
+ if (typeof config.accessTokenProvider !== "function")
65
+ throw createConfigError("[SDK] accessTokenProvider must be a function.");
66
+ const client = axios.create({
67
+ baseURL: BASE_URL,
68
+ timeout: config.timeout ?? 3e4,
69
+ headers: {
70
+ "Content-Type": "application/json",
71
+ "x-sdk-key": config.apiKey.trim(),
72
+ ...config.jwksUri?.trim() && { "x-jwks-uri": config.jwksUri.trim() }
73
+ }
74
+ });
75
+ client.interceptors.request.use(async (req) => {
76
+ const token = await config.accessTokenProvider();
77
+ if (token) {
78
+ req.headers["Authorization"] = `Bearer ${token}`;
79
+ }
80
+ debugLog(
81
+ "HTTP",
82
+ `\u2192 ${req.method?.toUpperCase()} ${req.url}`,
83
+ req.params ?? req.data
84
+ );
85
+ return req;
86
+ });
87
+ client.interceptors.response.use(
88
+ (res) => {
89
+ debugLog("HTTP", `\u2190 ${res.status} ${res.config.url}`);
90
+ return res;
91
+ },
92
+ (err) => {
93
+ const status = err.response?.status;
94
+ const message = err.response?.data?.message ?? err.message ?? "Unknown error";
95
+ const url = err.config?.url ?? "";
96
+ debugLog();
97
+ if (!status) {
98
+ throw createRequestError(
99
+ `[SDK] Network error reaching ${url}: ${message}`,
100
+ err
101
+ );
102
+ }
103
+ if (status === 401 || status === 403) {
104
+ throw createAuthError(
105
+ `[SDK] Authentication failed (${status}): ${message}`,
106
+ err
107
+ );
108
+ }
109
+ if (status === 422 || status === 400) {
110
+ throw createValidationError(
111
+ `[SDK] Validation error (${status}): ${message}`,
112
+ err
113
+ );
114
+ }
115
+ if (url.includes("/uploader")) {
116
+ throw createUploadError(
117
+ `[SDK] Upload operation failed (${status}): ${message}`,
118
+ err
119
+ );
120
+ }
121
+ throw createRequestError(
122
+ `[SDK] Request failed (${status}): ${message}`,
123
+ err
124
+ );
125
+ }
126
+ );
127
+ return client;
128
+ }
129
+
130
+ // src/modules/media.ts
131
+ function createMediaModule(http) {
132
+ async function addVideo(data) {
133
+ await http.post("/media/video", data);
134
+ debugLog();
135
+ }
136
+ async function updateVideo(spaceItemId, data) {
137
+ await http.patch(`/media/video/${spaceItemId}`, data);
138
+ debugLog();
139
+ }
140
+ async function addStream(data) {
141
+ await http.post("/media/stream", data);
142
+ debugLog();
143
+ }
144
+ async function updateStream(spaceItemId, data) {
145
+ await http.patch(`/media/stream/${spaceItemId}`, data);
146
+ debugLog();
147
+ }
148
+ async function addLink(data) {
149
+ await http.post("/media/link", data);
150
+ debugLog();
151
+ }
152
+ async function updateLink(spaceItemId, data) {
153
+ await http.patch(`/media/link/${spaceItemId}`, data);
154
+ debugLog();
155
+ }
156
+ return {
157
+ addVideo,
158
+ updateVideo,
159
+ addStream,
160
+ updateStream,
161
+ addLink,
162
+ updateLink
163
+ };
164
+ }
165
+
166
+ // src/modules/sketchfab.ts
167
+ function createSketchfabModule(http) {
168
+ async function addObject(data) {
169
+ await http.post("/sketchfab/object", data);
170
+ debugLog();
171
+ }
172
+ async function updateObject(spaceItemId, data) {
173
+ await http.patch(`/sketchfab/${spaceItemId}`, data);
174
+ debugLog();
175
+ }
176
+ return { addObject, updateObject };
177
+ }
178
+
179
+ // src/modules/transform.ts
180
+ function createTransformModule(http) {
181
+ async function updatePosition(spaceItemId, data) {
182
+ await http.patch(`/transform/${spaceItemId}/position`, data);
183
+ debugLog();
184
+ }
185
+ async function updateRotation(spaceItemId, data) {
186
+ await http.patch(`/transform/${spaceItemId}/rotation`, data);
187
+ debugLog();
188
+ }
189
+ async function updateScale(spaceItemId, data) {
190
+ await http.patch(`/transform/${spaceItemId}/scale`, data);
191
+ debugLog();
192
+ }
193
+ async function snapToGround(spaceItemId, data) {
194
+ await http.post(`/transform/${spaceItemId}/snap`, data);
195
+ debugLog();
196
+ }
197
+ return { updatePosition, updateRotation, updateScale, snapToGround };
198
+ }
199
+
200
+ // src/modules/layer.ts
201
+ function createLayerModule(http) {
202
+ async function lockItem(spaceItemId, data) {
203
+ await http.patch(`/layer/${spaceItemId}/lock`, data);
204
+ debugLog();
205
+ }
206
+ async function renameItem(spaceItemId, data) {
207
+ await http.patch(`/layer/${spaceItemId}/rename`, data);
208
+ debugLog();
209
+ }
210
+ async function deleteItem(spaceItemId, data) {
211
+ await http.delete(`/layer/${spaceItemId}`, { data });
212
+ debugLog();
213
+ }
214
+ async function deleteAll(data) {
215
+ await http.delete("/layer", { data });
216
+ debugLog();
217
+ }
218
+ return { lockItem, renameItem, deleteItem, deleteAll };
219
+ }
220
+
221
+ // src/modules/configuratorItems.ts
222
+ function createConfiguratorItemsModule(http) {
223
+ async function create(data) {
224
+ await http.post("/configurator_items", data);
225
+ debugLog();
226
+ }
227
+ async function updateState(spaceItemId, data) {
228
+ await http.patch(`/configurator_items/${spaceItemId}/state`, data);
229
+ debugLog();
230
+ }
231
+ return { create, updateState };
232
+ }
233
+
234
+ // src/modules/configuratorObjects.ts
235
+ function createConfiguratorObjectsModule(http) {
236
+ async function create(data) {
237
+ await http.post("/configurator_objects", data);
238
+ debugLog();
239
+ }
240
+ async function updateConfiguration(spaceItemId, data) {
241
+ await http.patch(
242
+ `/configurator_objects/${spaceItemId}/configuration`,
243
+ data
244
+ );
245
+ debugLog();
246
+ }
247
+ return { create, updateConfiguration };
248
+ }
249
+
250
+ // src/index.ts
251
+ function createConfiguratorSDK(config) {
252
+ const http = createHttpClient(config);
253
+ debugLog("ConfiguratorSDK", "Initialized", {
254
+ timeout: config.timeout ?? 3e4
255
+ });
256
+ return {
257
+ media: createMediaModule(http),
258
+ sketchfab: createSketchfabModule(http),
259
+ transform: createTransformModule(http),
260
+ layer: createLayerModule(http),
261
+ configuratorItems: createConfiguratorItemsModule(http),
262
+ configuratorObjects: createConfiguratorObjectsModule(http)
263
+ };
264
+ }
265
+ var ConfiguratorSDK = {
266
+ /**
267
+ * Create a new SDK client instance.
268
+ * @param config SDK configuration — apiKey is required, timeout is optional.
269
+ */
270
+ create(config) {
271
+ return createConfiguratorSDK(config);
272
+ }
273
+ };
274
+ var index_default = ConfiguratorSDK;
275
+
276
+ export { createConfiguratorSDK, index_default as default, isAlliumError };
277
+ //# sourceMappingURL=index.mjs.map
278
+ //# sourceMappingURL=index.mjs.map