@swan-admin/swan-ai-measurements 1.1.47 → 1.1.49

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.
@@ -28,4 +28,5 @@ export declare const requiredMetaData: RequiredMetaDataKeys[];
28
28
  export declare const REQUIRED_MESSAGE: string;
29
29
  export declare const REQUIRED_MESSAGE_FOR_META_DATA: string;
30
30
  export declare const REQUIRED_ERROR_MESSAGE_INVALID_EMAIL = "Invalid Email";
31
+ export declare const CHUNK_SIZE: number;
31
32
  export {};
package/dist/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.REQUIRED_ERROR_MESSAGE_INVALID_EMAIL = exports.REQUIRED_MESSAGE_FOR_META_DATA = exports.REQUIRED_MESSAGE = exports.requiredMetaData = exports.API_ENDPOINTS = exports.APP_POSE_DETECTION_WEBSOCKET_URL = exports.APP_BASE_WEBSOCKET_URL = exports.APP_AUTH_BASE_URL = exports.FILE_UPLOAD_ENDPOINT = exports.PROD_URL = exports.STAGING_URL = void 0;
3
+ exports.CHUNK_SIZE = exports.REQUIRED_ERROR_MESSAGE_INVALID_EMAIL = exports.REQUIRED_MESSAGE_FOR_META_DATA = exports.REQUIRED_MESSAGE = exports.requiredMetaData = exports.API_ENDPOINTS = exports.APP_POSE_DETECTION_WEBSOCKET_URL = exports.APP_BASE_WEBSOCKET_URL = exports.APP_AUTH_BASE_URL = exports.FILE_UPLOAD_ENDPOINT = exports.PROD_URL = exports.STAGING_URL = void 0;
4
4
  exports.STAGING_URL = {
5
5
  APP_AUTH_BASE_URL: "https://staging.api.getswan.co",
6
6
  APP_BASE_WEBSOCKET_URL: "wss://staging.wsnotify.api.getswan.co",
@@ -44,3 +44,4 @@ exports.requiredMetaData = ["gender", "focal_length", "height", "customer_store_
44
44
  exports.REQUIRED_MESSAGE = "Please verify required parameters";
45
45
  exports.REQUIRED_MESSAGE_FOR_META_DATA = "Please verify required parameters in meta data";
46
46
  exports.REQUIRED_ERROR_MESSAGE_INVALID_EMAIL = "Invalid Email";
47
+ exports.CHUNK_SIZE = 5 * 1024 * 1024;
@@ -28,4 +28,5 @@ export declare const requiredMetaData: RequiredMetaDataKeys[];
28
28
  export declare const REQUIRED_MESSAGE: string;
29
29
  export declare const REQUIRED_MESSAGE_FOR_META_DATA: string;
30
30
  export declare const REQUIRED_ERROR_MESSAGE_INVALID_EMAIL = "Invalid Email";
31
+ export declare const CHUNK_SIZE: number;
31
32
  export {};
@@ -41,3 +41,4 @@ export const requiredMetaData = ["gender", "focal_length", "height", "customer_s
41
41
  export const REQUIRED_MESSAGE = "Please verify required parameters";
42
42
  export const REQUIRED_MESSAGE_FOR_META_DATA = "Please verify required parameters in meta data";
43
43
  export const REQUIRED_ERROR_MESSAGE_INVALID_EMAIL = "Invalid Email";
44
+ export const CHUNK_SIZE = 5 * 1024 * 1024;
@@ -25,11 +25,17 @@ interface UploadOptions {
25
25
  arrayMetaData: Partial<ObjMetaData>[];
26
26
  scanId: string;
27
27
  email: string;
28
+ callBack?: (a: {
29
+ eventName: string;
30
+ message: string;
31
+ scanId: string;
32
+ email?: string;
33
+ }) => void;
28
34
  }
29
35
  export default class FileUpload {
30
36
  #private;
31
37
  constructor(accessKey: string, stagingUrl?: boolean);
32
- uploadFileFrontend({ file, arrayMetaData, scanId, email }: UploadOptions): Promise<unknown>;
38
+ uploadFileFrontend({ file, arrayMetaData, scanId, email, callBack }: UploadOptions): Promise<unknown>;
33
39
  uploadFile({ file, arrayMetaData, scanId, email }: UploadOptions): Promise<unknown>;
34
40
  setDeviceInfo(data: SetDeviceInfo): Promise<import("axios").AxiosResponse<any, any>>;
35
41
  }
@@ -31,7 +31,7 @@ var __rest = (this && this.__rest) || function (s, e) {
31
31
  };
32
32
  var _FileUpload_uppyIns, _FileUpload_accessKey, _FileUpload_stagingUrl;
33
33
  import axios from "axios";
34
- import { REQUIRED_MESSAGE, REQUIRED_MESSAGE_FOR_META_DATA, FILE_UPLOAD_ENDPOINT, APP_AUTH_BASE_URL, REQUIRED_ERROR_MESSAGE_INVALID_EMAIL, API_ENDPOINTS, } from "./constants.js";
34
+ import { REQUIRED_MESSAGE, REQUIRED_MESSAGE_FOR_META_DATA, FILE_UPLOAD_ENDPOINT, APP_AUTH_BASE_URL, REQUIRED_ERROR_MESSAGE_INVALID_EMAIL, API_ENDPOINTS, CHUNK_SIZE } from "./constants.js";
35
35
  import { addScanType, checkMetaDataValue, checkParameters, fetchData, getFileChunks, getUrl, isValidEmail } from "./utils.js";
36
36
  import Uppy from "@uppy/core";
37
37
  import AwsS3Multipart from "@uppy/aws-s3-multipart";
@@ -44,7 +44,7 @@ class FileUpload {
44
44
  __classPrivateFieldSet(this, _FileUpload_stagingUrl, stagingUrl, "f");
45
45
  }
46
46
  uploadFileFrontend(_a) {
47
- return __awaiter(this, arguments, void 0, function* ({ file, arrayMetaData, scanId, email }) {
47
+ return __awaiter(this, arguments, void 0, function* ({ file, arrayMetaData, scanId, email, callBack }) {
48
48
  if (!checkParameters(file, arrayMetaData, scanId, email)) {
49
49
  throw new Error(REQUIRED_MESSAGE);
50
50
  }
@@ -64,8 +64,10 @@ class FileUpload {
64
64
  limit: 10,
65
65
  retryDelays: [0, 1000, 3000, 5000],
66
66
  companionUrl: getUrl({ urlName: APP_AUTH_BASE_URL, stagingUrl: __classPrivateFieldGet(this, _FileUpload_stagingUrl, "f") }),
67
- getChunkSize: () => 5 * 1024 * 1024,
67
+ getChunkSize: () => CHUNK_SIZE,
68
68
  createMultipartUpload: (file) => {
69
+ const totalChunks = Math.ceil(file.size / CHUNK_SIZE);
70
+ callBack === null || callBack === void 0 ? void 0 : callBack({ eventName: "uploading_start", message: `File ${file.name} will be divided into ${totalChunks} chunks`, scanId, email });
69
71
  const objectKey = `${scanId}.${file.extension}`;
70
72
  return fetchData({
71
73
  path: FILE_UPLOAD_ENDPOINT.UPLOAD_START,
@@ -78,17 +80,23 @@ class FileUpload {
78
80
  },
79
81
  });
80
82
  },
81
- completeMultipartUpload: (file, { uploadId, key, parts }) => fetchData({
82
- path: FILE_UPLOAD_ENDPOINT.UPLOAD_COMPLETE,
83
- apiKey: __classPrivateFieldGet(this, _FileUpload_accessKey, "f"),
84
- stagingUrl: __classPrivateFieldGet(this, _FileUpload_stagingUrl, "f"),
85
- body: {
86
- uploadId,
87
- objectKey: key,
88
- parts,
89
- originalFileName: file.name,
90
- },
91
- }),
83
+ completeMultipartUpload: (file, { uploadId, key, parts }) => {
84
+ callBack === null || callBack === void 0 ? void 0 : callBack({ eventName: "uploading_complete_start", message: `${parts.length} chunks of file, uploaded`, scanId, email });
85
+ return fetchData({
86
+ path: FILE_UPLOAD_ENDPOINT.UPLOAD_COMPLETE,
87
+ apiKey: __classPrivateFieldGet(this, _FileUpload_accessKey, "f"),
88
+ stagingUrl: __classPrivateFieldGet(this, _FileUpload_stagingUrl, "f"),
89
+ body: {
90
+ uploadId,
91
+ objectKey: key,
92
+ parts,
93
+ originalFileName: file.name,
94
+ },
95
+ }).then((response) => {
96
+ callBack === null || callBack === void 0 ? void 0 : callBack({ eventName: "uploading_complete_end", message: `Multipart upload completed successfully`, scanId, email });
97
+ return response;
98
+ });
99
+ },
92
100
  signPart: (file, partData) => fetchData({
93
101
  path: FILE_UPLOAD_ENDPOINT.UPLOAD_SIGN_PART,
94
102
  stagingUrl: __classPrivateFieldGet(this, _FileUpload_stagingUrl, "f"),
@@ -107,7 +115,12 @@ class FileUpload {
107
115
  data: file,
108
116
  });
109
117
  __classPrivateFieldGet(this, _FileUpload_uppyIns, "f").on("upload-error", (file, error, response) => {
110
- reject(error);
118
+ if (error.isNetworkError) {
119
+ __classPrivateFieldGet(this, _FileUpload_uppyIns, "f").retryUpload(file.id);
120
+ }
121
+ else {
122
+ reject(error);
123
+ }
111
124
  });
112
125
  __classPrivateFieldGet(this, _FileUpload_uppyIns, "f").on("upload-success", () => {
113
126
  resolve({ message: "file uploaded successfully" });
@@ -1,13 +1,4 @@
1
1
  import { AxiosResponse } from "axios";
2
- interface TryOnSocketOptions {
3
- shopDomain: string;
4
- scanId: string;
5
- productName: string;
6
- onError?: (error: any) => void;
7
- onSuccess?: (data: any) => void;
8
- onClose?: () => void;
9
- onOpen?: () => void;
10
- }
11
2
  interface MeasurementRecommendation {
12
3
  shopDomain: string;
13
4
  scanId: string;
@@ -25,8 +16,6 @@ declare class Measurement {
25
16
  constructor(accessKey: string, stagingUrl?: boolean);
26
17
  getMeasurementResult(scanId: string): Promise<AxiosResponse<any>>;
27
18
  getMeasurementRecommendation({ scanId, shopDomain, productName }: MeasurementRecommendation): Promise<AxiosResponse<any>>;
28
- getTryOnMeasurements({ scanId, shopDomain, productName }: TryOnSocketOptions): Promise<AxiosResponse<any>>;
29
- handleTryOnSocket(options: TryOnSocketOptions): void;
30
19
  handleMeasurementSocket(options: MeasurementSocketOptions): void;
31
20
  }
32
21
  export default Measurement;
@@ -18,14 +18,13 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
18
18
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
19
19
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
20
20
  };
21
- var _Measurement_instances, _Measurement_tryOnSocketRef, _Measurement_measurementSocketRef, _Measurement_timerPollingRef, _Measurement_timerWaitingRef, _Measurement_count, _Measurement_accessKey, _Measurement_stagingUrl, _Measurement_getMeasurementsCheck, _Measurement_handlePolling, _Measurement_disconnectSocket, _Measurement_handleTimeOut;
21
+ var _Measurement_instances, _Measurement_measurementSocketRef, _Measurement_timerPollingRef, _Measurement_timerWaitingRef, _Measurement_count, _Measurement_accessKey, _Measurement_stagingUrl, _Measurement_getMeasurementsCheck, _Measurement_handlePolling, _Measurement_disconnectSocket, _Measurement_handleTimeOut;
22
22
  import axios from "axios";
23
23
  import { API_ENDPOINTS, APP_AUTH_BASE_URL, APP_BASE_WEBSOCKET_URL, REQUIRED_MESSAGE } from "./constants.js";
24
24
  import { checkParameters, getUrl } from "./utils.js";
25
25
  class Measurement {
26
26
  constructor(accessKey, stagingUrl = false) {
27
27
  _Measurement_instances.add(this);
28
- _Measurement_tryOnSocketRef.set(this, null);
29
28
  _Measurement_measurementSocketRef.set(this, null);
30
29
  _Measurement_timerPollingRef.set(this, null);
31
30
  _Measurement_timerWaitingRef.set(this, null);
@@ -50,53 +49,6 @@ class Measurement {
50
49
  }
51
50
  return axios.get(`${getUrl({ urlName: APP_AUTH_BASE_URL, stagingUrl: __classPrivateFieldGet(this, _Measurement_stagingUrl, "f") })}${API_ENDPOINTS.RECOMMENDATION}/scan/${scanId}/shop/${shopDomain}/product/${productName}`, { headers: { "X-Api-Key": __classPrivateFieldGet(this, _Measurement_accessKey, "f") } });
52
51
  }
53
- getTryOnMeasurements({ scanId, shopDomain, productName }) {
54
- if (!checkParameters(scanId, shopDomain, productName)) {
55
- throw new Error(REQUIRED_MESSAGE);
56
- }
57
- const tryOnUrl = `${getUrl({ urlName: APP_AUTH_BASE_URL, stagingUrl: __classPrivateFieldGet(this, _Measurement_stagingUrl, "f") })}${API_ENDPOINTS.TRY_ON_SCAN}/${scanId}/shop/${shopDomain}/product/${productName}`;
58
- return axios.get(tryOnUrl, { headers: { "X-Api-Key": __classPrivateFieldGet(this, _Measurement_accessKey, "f") } });
59
- }
60
- handleTryOnSocket(options) {
61
- var _a;
62
- const { shopDomain, scanId, productName, onError, onSuccess, onClose, onOpen } = options;
63
- if (!checkParameters(shopDomain, scanId, productName)) {
64
- throw new Error(REQUIRED_MESSAGE);
65
- }
66
- (_a = __classPrivateFieldGet(this, _Measurement_tryOnSocketRef, "f")) === null || _a === void 0 ? void 0 : _a.close();
67
- const url = `${getUrl({
68
- urlName: APP_BASE_WEBSOCKET_URL,
69
- stagingUrl: __classPrivateFieldGet(this, _Measurement_stagingUrl, "f"),
70
- })}/develop?store_url=${shopDomain}&product_name=${productName}&scan_id=${scanId}`;
71
- __classPrivateFieldSet(this, _Measurement_tryOnSocketRef, new WebSocket(url), "f");
72
- if (__classPrivateFieldGet(this, _Measurement_tryOnSocketRef, "f")) {
73
- __classPrivateFieldGet(this, _Measurement_tryOnSocketRef, "f").onopen = () => {
74
- onOpen === null || onOpen === void 0 ? void 0 : onOpen();
75
- };
76
- __classPrivateFieldGet(this, _Measurement_tryOnSocketRef, "f").onmessage = (event) => {
77
- let data;
78
- try {
79
- data = JSON.parse(event.data);
80
- }
81
- catch (error) {
82
- console.log(data, error, "noy correct format for data");
83
- return;
84
- }
85
- if ((data === null || data === void 0 ? void 0 : data.tryOnProcessStatus) === "available") {
86
- onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(data);
87
- }
88
- else {
89
- onError === null || onError === void 0 ? void 0 : onError({ message: "failed to get image urls" });
90
- }
91
- };
92
- __classPrivateFieldGet(this, _Measurement_tryOnSocketRef, "f").onclose = () => {
93
- onClose === null || onClose === void 0 ? void 0 : onClose();
94
- };
95
- __classPrivateFieldGet(this, _Measurement_tryOnSocketRef, "f").onerror = (event) => {
96
- onError === null || onError === void 0 ? void 0 : onError(event);
97
- };
98
- }
99
- }
100
52
  handleMeasurementSocket(options) {
101
53
  const { scanId, onError, onSuccess, onClose, onOpen } = options;
102
54
  if (!checkParameters(scanId)) {
@@ -131,7 +83,7 @@ class Measurement {
131
83
  }, 5000);
132
84
  }
133
85
  }
134
- _Measurement_tryOnSocketRef = new WeakMap(), _Measurement_measurementSocketRef = new WeakMap(), _Measurement_timerPollingRef = new WeakMap(), _Measurement_timerWaitingRef = new WeakMap(), _Measurement_count = new WeakMap(), _Measurement_accessKey = new WeakMap(), _Measurement_stagingUrl = new WeakMap(), _Measurement_instances = new WeakSet(), _Measurement_getMeasurementsCheck = function _Measurement_getMeasurementsCheck(options) {
86
+ _Measurement_measurementSocketRef = new WeakMap(), _Measurement_timerPollingRef = new WeakMap(), _Measurement_timerWaitingRef = new WeakMap(), _Measurement_count = new WeakMap(), _Measurement_accessKey = new WeakMap(), _Measurement_stagingUrl = new WeakMap(), _Measurement_instances = new WeakSet(), _Measurement_getMeasurementsCheck = function _Measurement_getMeasurementsCheck(options) {
135
87
  return __awaiter(this, void 0, void 0, function* () {
136
88
  var _a;
137
89
  var _b;
@@ -25,11 +25,17 @@ interface UploadOptions {
25
25
  arrayMetaData: Partial<ObjMetaData>[];
26
26
  scanId: string;
27
27
  email: string;
28
+ callBack?: (a: {
29
+ eventName: string;
30
+ message: string;
31
+ scanId: string;
32
+ email?: string;
33
+ }) => void;
28
34
  }
29
35
  export default class FileUpload {
30
36
  #private;
31
37
  constructor(accessKey: string, stagingUrl?: boolean);
32
- uploadFileFrontend({ file, arrayMetaData, scanId, email }: UploadOptions): Promise<unknown>;
38
+ uploadFileFrontend({ file, arrayMetaData, scanId, email, callBack }: UploadOptions): Promise<unknown>;
33
39
  uploadFile({ file, arrayMetaData, scanId, email }: UploadOptions): Promise<unknown>;
34
40
  setDeviceInfo(data: SetDeviceInfo): Promise<import("axios").AxiosResponse<any, any>>;
35
41
  }
@@ -16,7 +16,7 @@ class FileUpload {
16
16
  this.#accessKey = accessKey;
17
17
  this.#stagingUrl = stagingUrl;
18
18
  }
19
- async uploadFileFrontend({ file, arrayMetaData, scanId, email }) {
19
+ async uploadFileFrontend({ file, arrayMetaData, scanId, email, callBack }) {
20
20
  if (!(0, utils_js_1.checkParameters)(file, arrayMetaData, scanId, email)) {
21
21
  throw new Error(constants_js_1.REQUIRED_MESSAGE);
22
22
  }
@@ -36,8 +36,10 @@ class FileUpload {
36
36
  limit: 10,
37
37
  retryDelays: [0, 1000, 3000, 5000],
38
38
  companionUrl: (0, utils_js_1.getUrl)({ urlName: constants_js_1.APP_AUTH_BASE_URL, stagingUrl: this.#stagingUrl }),
39
- getChunkSize: () => 5 * 1024 * 1024,
39
+ getChunkSize: () => constants_js_1.CHUNK_SIZE,
40
40
  createMultipartUpload: (file) => {
41
+ const totalChunks = Math.ceil(file.size / constants_js_1.CHUNK_SIZE);
42
+ callBack?.({ eventName: "uploading_start", message: `File ${file.name} will be divided into ${totalChunks} chunks`, scanId, email });
41
43
  const objectKey = `${scanId}.${file.extension}`;
42
44
  return (0, utils_js_1.fetchData)({
43
45
  path: constants_js_1.FILE_UPLOAD_ENDPOINT.UPLOAD_START,
@@ -50,17 +52,23 @@ class FileUpload {
50
52
  },
51
53
  });
52
54
  },
53
- completeMultipartUpload: (file, { uploadId, key, parts }) => (0, utils_js_1.fetchData)({
54
- path: constants_js_1.FILE_UPLOAD_ENDPOINT.UPLOAD_COMPLETE,
55
- apiKey: this.#accessKey,
56
- stagingUrl: this.#stagingUrl,
57
- body: {
58
- uploadId,
59
- objectKey: key,
60
- parts,
61
- originalFileName: file.name,
62
- },
63
- }),
55
+ completeMultipartUpload: (file, { uploadId, key, parts }) => {
56
+ callBack?.({ eventName: "uploading_complete_start", message: `${parts.length} chunks of file, uploaded`, scanId, email });
57
+ return (0, utils_js_1.fetchData)({
58
+ path: constants_js_1.FILE_UPLOAD_ENDPOINT.UPLOAD_COMPLETE,
59
+ apiKey: this.#accessKey,
60
+ stagingUrl: this.#stagingUrl,
61
+ body: {
62
+ uploadId,
63
+ objectKey: key,
64
+ parts,
65
+ originalFileName: file.name,
66
+ },
67
+ }).then((response) => {
68
+ callBack?.({ eventName: "uploading_complete_end", message: `Multipart upload completed successfully`, scanId, email });
69
+ return response;
70
+ });
71
+ },
64
72
  signPart: (file, partData) => (0, utils_js_1.fetchData)({
65
73
  path: constants_js_1.FILE_UPLOAD_ENDPOINT.UPLOAD_SIGN_PART,
66
74
  stagingUrl: this.#stagingUrl,
@@ -79,7 +87,12 @@ class FileUpload {
79
87
  data: file,
80
88
  });
81
89
  this.#uppyIns.on("upload-error", (file, error, response) => {
82
- reject(error);
90
+ if (error.isNetworkError) {
91
+ this.#uppyIns.retryUpload(file.id);
92
+ }
93
+ else {
94
+ reject(error);
95
+ }
83
96
  });
84
97
  this.#uppyIns.on("upload-success", () => {
85
98
  resolve({ message: "file uploaded successfully" });
@@ -1,13 +1,4 @@
1
1
  import { AxiosResponse } from "axios";
2
- interface TryOnSocketOptions {
3
- shopDomain: string;
4
- scanId: string;
5
- productName: string;
6
- onError?: (error: any) => void;
7
- onSuccess?: (data: any) => void;
8
- onClose?: () => void;
9
- onOpen?: () => void;
10
- }
11
2
  interface MeasurementRecommendation {
12
3
  shopDomain: string;
13
4
  scanId: string;
@@ -25,8 +16,6 @@ declare class Measurement {
25
16
  constructor(accessKey: string, stagingUrl?: boolean);
26
17
  getMeasurementResult(scanId: string): Promise<AxiosResponse<any>>;
27
18
  getMeasurementRecommendation({ scanId, shopDomain, productName }: MeasurementRecommendation): Promise<AxiosResponse<any>>;
28
- getTryOnMeasurements({ scanId, shopDomain, productName }: TryOnSocketOptions): Promise<AxiosResponse<any>>;
29
- handleTryOnSocket(options: TryOnSocketOptions): void;
30
19
  handleMeasurementSocket(options: MeasurementSocketOptions): void;
31
20
  }
32
21
  export default Measurement;
@@ -7,7 +7,6 @@ const axios_1 = __importDefault(require("axios"));
7
7
  const constants_js_1 = require("./constants.js");
8
8
  const utils_js_1 = require("./utils.js");
9
9
  class Measurement {
10
- #tryOnSocketRef = null;
11
10
  #measurementSocketRef = null;
12
11
  #timerPollingRef = null;
13
12
  #timerWaitingRef = null;
@@ -33,52 +32,6 @@ class Measurement {
33
32
  }
34
33
  return axios_1.default.get(`${(0, utils_js_1.getUrl)({ urlName: constants_js_1.APP_AUTH_BASE_URL, stagingUrl: this.#stagingUrl })}${constants_js_1.API_ENDPOINTS.RECOMMENDATION}/scan/${scanId}/shop/${shopDomain}/product/${productName}`, { headers: { "X-Api-Key": this.#accessKey } });
35
34
  }
36
- getTryOnMeasurements({ scanId, shopDomain, productName }) {
37
- if (!(0, utils_js_1.checkParameters)(scanId, shopDomain, productName)) {
38
- throw new Error(constants_js_1.REQUIRED_MESSAGE);
39
- }
40
- const tryOnUrl = `${(0, utils_js_1.getUrl)({ urlName: constants_js_1.APP_AUTH_BASE_URL, stagingUrl: this.#stagingUrl })}${constants_js_1.API_ENDPOINTS.TRY_ON_SCAN}/${scanId}/shop/${shopDomain}/product/${productName}`;
41
- return axios_1.default.get(tryOnUrl, { headers: { "X-Api-Key": this.#accessKey } });
42
- }
43
- handleTryOnSocket(options) {
44
- const { shopDomain, scanId, productName, onError, onSuccess, onClose, onOpen } = options;
45
- if (!(0, utils_js_1.checkParameters)(shopDomain, scanId, productName)) {
46
- throw new Error(constants_js_1.REQUIRED_MESSAGE);
47
- }
48
- this.#tryOnSocketRef?.close();
49
- const url = `${(0, utils_js_1.getUrl)({
50
- urlName: constants_js_1.APP_BASE_WEBSOCKET_URL,
51
- stagingUrl: this.#stagingUrl,
52
- })}/develop?store_url=${shopDomain}&product_name=${productName}&scan_id=${scanId}`;
53
- this.#tryOnSocketRef = new WebSocket(url);
54
- if (this.#tryOnSocketRef) {
55
- this.#tryOnSocketRef.onopen = () => {
56
- onOpen?.();
57
- };
58
- this.#tryOnSocketRef.onmessage = (event) => {
59
- let data;
60
- try {
61
- data = JSON.parse(event.data);
62
- }
63
- catch (error) {
64
- console.log(data, error, "noy correct format for data");
65
- return;
66
- }
67
- if (data?.tryOnProcessStatus === "available") {
68
- onSuccess?.(data);
69
- }
70
- else {
71
- onError?.({ message: "failed to get image urls" });
72
- }
73
- };
74
- this.#tryOnSocketRef.onclose = () => {
75
- onClose?.();
76
- };
77
- this.#tryOnSocketRef.onerror = (event) => {
78
- onError?.(event);
79
- };
80
- }
81
- }
82
35
  async #getMeasurementsCheck(options) {
83
36
  const { scanId, onSuccess, onError } = options;
84
37
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swan-admin/swan-ai-measurements",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "provides ai measurement suggestion",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",
package/src/fileUpload.ts CHANGED
@@ -27,7 +27,7 @@ interface UploadOptions {
27
27
  arrayMetaData: Partial<ObjMetaData>[];
28
28
  scanId: string;
29
29
  email: string;
30
- callBack?: (a: { eventName: string; message: string }) => void;
30
+ callBack?: (a: { eventName: string; message: string,scanId:string,email?:string }) => void;
31
31
  }
32
32
 
33
33
  export default class FileUpload {
@@ -63,7 +63,7 @@ export default class FileUpload {
63
63
  getChunkSize: () => CHUNK_SIZE,
64
64
  createMultipartUpload: (file: any) => {
65
65
  const totalChunks = Math.ceil(file.size / CHUNK_SIZE);
66
- callBack?.({eventName:"uploading_start",message:`File ${file.name} will be divided into ${totalChunks} chunks`})
66
+ callBack?.({eventName:"uploading_start",message:`File ${file.name} will be divided into ${totalChunks} chunks`,scanId,email})
67
67
  const objectKey = `${scanId}.${file.extension}`;
68
68
  return fetchData({
69
69
  path: FILE_UPLOAD_ENDPOINT.UPLOAD_START,
@@ -77,7 +77,7 @@ export default class FileUpload {
77
77
  });
78
78
  },
79
79
  completeMultipartUpload: (file: any, { uploadId, key, parts }: { uploadId: string | number; key: string | number; parts: any }) => {
80
- callBack?.({eventName:"uploading_complete_start",message:`${parts.length} chunks of file, uploaded`})
80
+ callBack?.({eventName:"uploading_complete_start",message:`${parts.length} chunks of file, uploaded`,scanId,email})
81
81
  return fetchData({
82
82
  path: FILE_UPLOAD_ENDPOINT.UPLOAD_COMPLETE,
83
83
  apiKey: this.#accessKey,
@@ -89,7 +89,7 @@ export default class FileUpload {
89
89
  originalFileName: file.name,
90
90
  },
91
91
  }).then((response) => {
92
- callBack?.({eventName:"uploading_complete_end",message:`Multipart upload completed successfully`})
92
+ callBack?.({eventName:"uploading_complete_end",message:`Multipart upload completed successfully`,scanId,email})
93
93
  return response;
94
94
  });
95
95
  },