@sogni-ai/sogni-client 0.4.0-aplha.3 → 0.4.0-aplha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,15 @@
1
1
  import DataEntity, { EntityEvents } from '../lib/DataEntity';
2
2
  import ErrorData from '../types/ErrorData';
3
+ import { RawJob, RawProject } from './types/RawProject';
4
+ import ProjectsApi from './index';
5
+ import { Logger } from '../lib/DefaultLogger';
3
6
  export type JobStatus = 'pending' | 'initiating' | 'processing' | 'completed' | 'failed' | 'canceled';
4
7
  /**
5
8
  * @inline
6
9
  */
7
10
  export interface JobData {
8
11
  id: string;
12
+ projectId: string;
9
13
  status: JobStatus;
10
14
  step: number;
11
15
  stepCount: number;
@@ -22,13 +26,22 @@ export interface JobEventMap extends EntityEvents {
22
26
  completed: string;
23
27
  failed: ErrorData;
24
28
  }
29
+ export interface JobOptions {
30
+ api: ProjectsApi;
31
+ logger: Logger;
32
+ }
25
33
  declare class Job extends DataEntity<JobData, JobEventMap> {
26
- constructor(data: JobData);
34
+ static fromRaw(rawProject: RawProject, rawJob: RawJob, options: JobOptions): Job;
35
+ private readonly _api;
36
+ private readonly _logger;
37
+ constructor(data: JobData, options: JobOptions);
27
38
  get id(): string;
39
+ get projectId(): string;
28
40
  /**
29
41
  * Current status of the job.
30
42
  */
31
43
  get status(): JobStatus;
44
+ get finished(): boolean;
32
45
  /**
33
46
  * Progress of the job in percentage (0-100).
34
47
  */
@@ -66,6 +79,12 @@ declare class Job extends DataEntity<JobData, JobEventMap> {
66
79
  * Name of the worker that is processing this job.
67
80
  */
68
81
  get workerName(): string | undefined;
82
+ /**
83
+ * Syncs the job data with the data received from the REST API.
84
+ * @internal
85
+ * @param data
86
+ */
87
+ _syncWithRestData(data: RawJob): Promise<void>;
69
88
  private handleUpdated;
70
89
  }
71
90
  export default Job;
@@ -1,23 +1,63 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
5
14
  Object.defineProperty(exports, "__esModule", { value: true });
6
15
  const DataEntity_1 = __importDefault(require("../lib/DataEntity"));
16
+ const getUUID_1 = __importDefault(require("../lib/getUUID"));
17
+ const JOB_STATUS_MAP = {
18
+ created: 'pending',
19
+ queued: 'pending',
20
+ assigned: 'initiating',
21
+ initiatingModel: 'initiating',
22
+ jobStarted: 'processing',
23
+ jobProgress: 'processing',
24
+ jobCompleted: 'completed',
25
+ jobError: 'failed'
26
+ };
7
27
  class Job extends DataEntity_1.default {
8
- constructor(data) {
28
+ static fromRaw(rawProject, rawJob, options) {
29
+ return new Job({
30
+ id: rawJob.imgID || (0, getUUID_1.default)(),
31
+ projectId: rawProject.id,
32
+ status: JOB_STATUS_MAP[rawJob.status],
33
+ step: rawJob.performedSteps,
34
+ stepCount: rawProject.stepCount,
35
+ workerName: rawJob.worker.name,
36
+ seed: rawJob.seedUsed,
37
+ isNSFW: rawJob.triggeredNSFWFilter
38
+ }, options);
39
+ }
40
+ constructor(data, options) {
9
41
  super(data);
42
+ this._api = options.api;
43
+ this._logger = options.logger;
10
44
  this.on('updated', this.handleUpdated.bind(this));
11
45
  }
12
46
  get id() {
13
47
  return this.data.id;
14
48
  }
49
+ get projectId() {
50
+ return this.data.projectId;
51
+ }
15
52
  /**
16
53
  * Current status of the job.
17
54
  */
18
55
  get status() {
19
56
  return this.data.status;
20
57
  }
58
+ get finished() {
59
+ return ['completed', 'failed', 'canceled'].includes(this.status);
60
+ }
21
61
  /**
22
62
  * Progress of the job in percentage (0-100).
23
63
  */
@@ -75,6 +115,37 @@ class Job extends DataEntity_1.default {
75
115
  get workerName() {
76
116
  return this.data.workerName;
77
117
  }
118
+ /**
119
+ * Syncs the job data with the data received from the REST API.
120
+ * @internal
121
+ * @param data
122
+ */
123
+ _syncWithRestData(data) {
124
+ return __awaiter(this, void 0, void 0, function* () {
125
+ const delta = {
126
+ step: data.performedSteps,
127
+ workerName: data.worker.name,
128
+ seed: data.seedUsed,
129
+ isNSFW: data.triggeredNSFWFilter
130
+ };
131
+ if (JOB_STATUS_MAP[data.status]) {
132
+ delta.status = JOB_STATUS_MAP[data.status];
133
+ }
134
+ if (!this.data.resultUrl && delta.status === 'completed' && !data.triggeredNSFWFilter) {
135
+ try {
136
+ delta.resultUrl = yield this._api.downloadUrl({
137
+ jobId: this.projectId,
138
+ imageId: this.id,
139
+ type: 'complete'
140
+ });
141
+ }
142
+ catch (error) {
143
+ this._logger.error(error);
144
+ }
145
+ }
146
+ this._update(delta);
147
+ });
148
+ }
78
149
  handleUpdated(keys) {
79
150
  if (keys.includes('step') || keys.includes('stepCount')) {
80
151
  this.emit('progress', this.progress);
@@ -1 +1 @@
1
- {"version":3,"file":"Job.js","sourceRoot":"","sources":["../../src/Projects/Job.ts"],"names":[],"mappings":";;;;;AAAA,mEAA6D;AAkC7D,MAAM,GAAI,SAAQ,oBAAgC;IAChD,YAAY,IAAa;QACvB,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAC7B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IACrD,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IAC9B,CAAC;IAEO,aAAa,CAAC,IAAc;QAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAU,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;CACF;AAED,kBAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"Job.js","sourceRoot":"","sources":["../../src/Projects/Job.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,9 @@ import Job, { JobData } from './Job';
2
2
  import DataEntity, { EntityEvents } from '../lib/DataEntity';
3
3
  import { ProjectParams } from './types';
4
4
  import ErrorData from '../types/ErrorData';
5
- export type ProjectStatus = 'pending' | 'queued' | 'processing' | 'completed' | 'failed';
5
+ import ProjectsApi from './index';
6
+ import { Logger } from '../lib/DefaultLogger';
7
+ export type ProjectStatus = 'pending' | 'queued' | 'processing' | 'completed' | 'failed' | 'canceled';
6
8
  /**
7
9
  * @inline
8
10
  */
@@ -25,13 +27,22 @@ export interface ProjectEventMap extends EntityEvents {
25
27
  jobCompleted: Job;
26
28
  jobFailed: Job;
27
29
  }
30
+ export interface ProjectOptions {
31
+ api: ProjectsApi;
32
+ logger: Logger;
33
+ }
28
34
  declare class Project extends DataEntity<ProjectData, ProjectEventMap> {
29
35
  private _jobs;
30
36
  private _lastEmitedProgress;
31
- constructor(data: ProjectParams);
37
+ private readonly _api;
38
+ private readonly _logger;
39
+ private _timeout;
40
+ private _failedSyncAttempts;
41
+ constructor(data: ProjectParams, options: ProjectOptions);
32
42
  get id(): string;
33
43
  get params(): ProjectParams;
34
44
  get status(): ProjectStatus;
45
+ get finished(): boolean;
35
46
  get error(): ErrorData | undefined;
36
47
  /**
37
48
  * Progress of the project in percentage (0-100).
@@ -71,7 +82,14 @@ declare class Project extends DataEntity<ProjectData, ProjectEventMap> {
71
82
  * @internal
72
83
  * @param data
73
84
  */
74
- _addJob(data: JobData): Job;
85
+ _addJob(data: JobData | Job): Job;
86
+ private _handleJobFinished;
87
+ private _checkForTimeout;
88
+ /**
89
+ * Sync project data with the data received from the REST API.
90
+ * @internal
91
+ */
92
+ _syncToServer(): Promise<void>;
75
93
  /**
76
94
  * Get full project data snapshot. Can be used to serialize the project and store it in a database.
77
95
  */
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
@@ -7,8 +16,20 @@ const Job_1 = __importDefault(require("./Job"));
7
16
  const DataEntity_1 = __importDefault(require("../lib/DataEntity"));
8
17
  const cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
9
18
  const getUUID_1 = __importDefault(require("../lib/getUUID"));
19
+ // If project is not finished and had no updates for 1 minute, force refresh
20
+ const PROJECT_TIMEOUT = 60 * 1000;
21
+ const MAX_FAILED_SYNC_ATTEMPTS = 3;
22
+ const PROJECT_STATUS_MAP = {
23
+ pending: 'pending',
24
+ active: 'queued',
25
+ assigned: 'processing',
26
+ progress: 'processing',
27
+ completed: 'completed',
28
+ errored: 'failed',
29
+ cancelled: 'canceled'
30
+ };
10
31
  class Project extends DataEntity_1.default {
11
- constructor(data) {
32
+ constructor(data, options) {
12
33
  super({
13
34
  id: (0, getUUID_1.default)(),
14
35
  startedAt: new Date(),
@@ -18,6 +39,11 @@ class Project extends DataEntity_1.default {
18
39
  });
19
40
  this._jobs = [];
20
41
  this._lastEmitedProgress = -1;
42
+ this._timeout = null;
43
+ this._failedSyncAttempts = 0;
44
+ this._api = options.api;
45
+ this._logger = options.logger;
46
+ this._timeout = setInterval(this._checkForTimeout.bind(this), PROJECT_TIMEOUT);
21
47
  this.on('updated', this.handleUpdated.bind(this));
22
48
  }
23
49
  get id() {
@@ -29,6 +55,9 @@ class Project extends DataEntity_1.default {
29
55
  get status() {
30
56
  return this.data.status;
31
57
  }
58
+ get finished() {
59
+ return ['completed', 'failed', 'canceled'].includes(this.status);
60
+ }
32
61
  get error() {
33
62
  return this.data.error;
34
63
  }
@@ -99,6 +128,11 @@ class Project extends DataEntity_1.default {
99
128
  this.emit('progress', progress);
100
129
  this._lastEmitedProgress = progress;
101
130
  }
131
+ // If project is finished stop watching for timeout
132
+ if (this._timeout && this.finished) {
133
+ clearInterval(this._timeout);
134
+ this._timeout = null;
135
+ }
102
136
  if (keys.includes('status') || keys.includes('jobs')) {
103
137
  const allJobsDone = this.jobs.every((job) => ['completed', 'failed', 'canceled'].includes(job.status));
104
138
  if (this.data.status === 'completed' && allJobsDone) {
@@ -115,19 +149,93 @@ class Project extends DataEntity_1.default {
115
149
  * @param data
116
150
  */
117
151
  _addJob(data) {
118
- const job = new Job_1.default(data);
152
+ const job = data instanceof Job_1.default ? data : new Job_1.default(data, { api: this._api, logger: this._logger });
119
153
  this._jobs.push(job);
120
154
  job.on('updated', () => {
155
+ this.lastUpdated = new Date();
121
156
  this.emit('updated', ['jobs']);
122
157
  });
123
158
  job.on('completed', () => {
124
159
  this.emit('jobCompleted', job);
160
+ this._handleJobFinished(job);
125
161
  });
126
162
  job.on('failed', () => {
127
163
  this.emit('jobFailed', job);
164
+ this._handleJobFinished(job);
128
165
  });
129
166
  return job;
130
167
  }
168
+ _handleJobFinished(job) {
169
+ const finalStatus = ['completed', 'failed', 'canceled'];
170
+ const allJobsDone = this.jobs.every((job) => finalStatus.includes(job.status));
171
+ // If all jobs are done and project is not already failed or completed, update the project status
172
+ if (allJobsDone && this.status !== 'failed' && this.status !== 'completed') {
173
+ const allJobsFailed = this.jobs.every((job) => job.status === 'failed');
174
+ if (allJobsFailed) {
175
+ this._update({ status: 'failed' });
176
+ }
177
+ else {
178
+ this._update({ status: 'completed' });
179
+ }
180
+ }
181
+ }
182
+ _checkForTimeout() {
183
+ if (this.lastUpdated.getTime() + PROJECT_TIMEOUT < Date.now()) {
184
+ this._syncToServer().catch((error) => {
185
+ this._logger.error(error);
186
+ this._failedSyncAttempts++;
187
+ if (this._failedSyncAttempts > MAX_FAILED_SYNC_ATTEMPTS) {
188
+ this._logger.error(`Failed to sync project data after ${MAX_FAILED_SYNC_ATTEMPTS} attempts. Stopping further attempts.`);
189
+ clearInterval(this._timeout);
190
+ this._timeout = null;
191
+ }
192
+ });
193
+ }
194
+ }
195
+ /**
196
+ * Sync project data with the data received from the REST API.
197
+ * @internal
198
+ */
199
+ _syncToServer() {
200
+ return __awaiter(this, void 0, void 0, function* () {
201
+ const data = yield this._api.get(this.id);
202
+ const jobData = data.completedWorkerJobs.reduce((acc, job) => {
203
+ const jobId = job.imgID || (0, getUUID_1.default)();
204
+ acc[jobId] = job;
205
+ return acc;
206
+ }, {});
207
+ for (const job of this._jobs) {
208
+ const restJob = jobData[job.id];
209
+ // This should never happen, but just in case we log a warning
210
+ if (!restJob) {
211
+ this._logger.warn(`Job with id ${job.id} not found in the REST project data`);
212
+ return;
213
+ }
214
+ try {
215
+ yield job._syncWithRestData(restJob);
216
+ }
217
+ catch (error) {
218
+ this._logger.error(error);
219
+ this._logger.error(`Failed to sync job ${job.id}`);
220
+ }
221
+ delete jobData[job.id];
222
+ }
223
+ // If there are any jobs left in jobData, it means they are new jobs that are not in the project yet
224
+ if (Object.keys(jobData).length) {
225
+ for (const job of Object.values(jobData)) {
226
+ const jobInstance = Job_1.default.fromRaw(data, job, { api: this._api, logger: this._logger });
227
+ this._addJob(jobInstance);
228
+ }
229
+ }
230
+ const delta = {
231
+ params: Object.assign(Object.assign({}, this.data.params), { numberOfImages: data.imageCount, steps: data.stepCount, numberOfPreviews: data.previewCount })
232
+ };
233
+ if (PROJECT_STATUS_MAP[data.status]) {
234
+ delta.status = PROJECT_STATUS_MAP[data.status];
235
+ }
236
+ this._update(delta);
237
+ });
238
+ }
131
239
  /**
132
240
  * Get full project data snapshot. Can be used to serialize the project and store it in a database.
133
241
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Project.js","sourceRoot":"","sources":["../../src/Projects/Project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Project.js","sourceRoot":"","sources":["../../src/Projects/Project.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import ApiGroup, { ApiConfig } from '../ApiGroup';
2
- import { AvailableModel, EstimateRequest, ProjectParams } from './types';
2
+ import { AvailableModel, EstimateRequest, ImageUrlParams, ProjectParams } from './types';
3
3
  import Project from './Project';
4
4
  import { ProjectApiEvents } from './types/events';
5
+ import { RawProject } from './types/RawProject';
5
6
  declare class ProjectsApi extends ApiGroup<ProjectApiEvents> {
6
7
  private _availableModels;
7
8
  private projects;
@@ -28,6 +29,13 @@ declare class ProjectsApi extends ApiGroup<ProjectApiEvents> {
28
29
  * @param data
29
30
  */
30
31
  create(data: ProjectParams): Promise<Project>;
32
+ /**
33
+ * Get project by id, this API returns project data from the server only if the project is
34
+ * completed or failed. If the project is still processing, it will throw 404 error.
35
+ * @internal
36
+ * @param projectId
37
+ */
38
+ get(projectId: string): Promise<RawProject>;
31
39
  private uploadGuideImage;
32
40
  /**
33
41
  * Estimate project cost
@@ -36,7 +44,17 @@ declare class ProjectsApi extends ApiGroup<ProjectApiEvents> {
36
44
  token: string;
37
45
  usd: string;
38
46
  }>;
39
- private uploadUrl;
40
- private downloadUrl;
47
+ /**
48
+ * Get upload URL for image
49
+ * @internal
50
+ * @param params
51
+ */
52
+ uploadUrl(params: ImageUrlParams): Promise<string>;
53
+ /**
54
+ * Get download URL for image
55
+ * @internal
56
+ * @param params
57
+ */
58
+ downloadUrl(params: ImageUrlParams): Promise<string>;
41
59
  }
42
60
  export default ProjectsApi;
@@ -183,7 +183,11 @@ class ProjectsApi extends ApiGroup_1.default {
183
183
  error: event.error
184
184
  });
185
185
  }
186
- if (project.status === 'completed' || project.status === 'failed') {
186
+ if (project.finished) {
187
+ // Sync project data with the server and remove it from the list after some time
188
+ project._syncToServer().catch((e) => {
189
+ this.client.logger.error(e);
190
+ });
187
191
  setTimeout(() => {
188
192
  this.projects = this.projects.filter((p) => p.id !== event.projectId);
189
193
  }, GARBAGE_COLLECT_TIMEOUT);
@@ -198,6 +202,7 @@ class ProjectsApi extends ApiGroup_1.default {
198
202
  if (!job) {
199
203
  job = project._addJob({
200
204
  id: event.jobId,
205
+ projectId: event.projectId,
201
206
  status: 'pending',
202
207
  step: 0,
203
208
  stepCount: project.params.steps
@@ -277,7 +282,7 @@ class ProjectsApi extends ApiGroup_1.default {
277
282
  */
278
283
  create(data) {
279
284
  return __awaiter(this, void 0, void 0, function* () {
280
- const project = new Project_1.default(Object.assign({}, data));
285
+ const project = new Project_1.default(Object.assign({}, data), { api: this, logger: this.client.logger });
281
286
  if (data.startingImage) {
282
287
  yield this.uploadGuideImage(project.id, data.startingImage);
283
288
  }
@@ -287,6 +292,18 @@ class ProjectsApi extends ApiGroup_1.default {
287
292
  return project;
288
293
  });
289
294
  }
295
+ /**
296
+ * Get project by id, this API returns project data from the server only if the project is
297
+ * completed or failed. If the project is still processing, it will throw 404 error.
298
+ * @internal
299
+ * @param projectId
300
+ */
301
+ get(projectId) {
302
+ return __awaiter(this, void 0, void 0, function* () {
303
+ const { data } = yield this.client.rest.get(`/v1/projects/${projectId}`);
304
+ return data;
305
+ });
306
+ }
290
307
  uploadGuideImage(projectId, file) {
291
308
  return __awaiter(this, void 0, void 0, function* () {
292
309
  const imageId = (0, getUUID_1.default)();
@@ -321,12 +338,22 @@ class ProjectsApi extends ApiGroup_1.default {
321
338
  };
322
339
  });
323
340
  }
341
+ /**
342
+ * Get upload URL for image
343
+ * @internal
344
+ * @param params
345
+ */
324
346
  uploadUrl(params) {
325
347
  return __awaiter(this, void 0, void 0, function* () {
326
348
  const r = yield this.client.rest.get(`/v1/image/uploadUrl`, params);
327
349
  return r.data.uploadUrl;
328
350
  });
329
351
  }
352
+ /**
353
+ * Get download URL for image
354
+ * @internal
355
+ * @param params
356
+ */
330
357
  downloadUrl(params) {
331
358
  return __awaiter(this, void 0, void 0, function* () {
332
359
  const r = yield this.client.rest.get(`/v1/image/downloadUrl`, params);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Projects/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Projects/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { SupernetType } from '../../ApiClient/WebSocketClient/types';
2
+ export interface RawProject {
3
+ id: string;
4
+ SID: number;
5
+ artist: Account;
6
+ model: ProjectModel;
7
+ imageCount: number;
8
+ stepCount: number;
9
+ previewCount: number;
10
+ hasGuideImage: boolean;
11
+ denoiseStrength: string;
12
+ costEstimate: CostEstimate;
13
+ costActual: CostActual;
14
+ createTime: number;
15
+ updateTime: number;
16
+ endTime: number;
17
+ status: RawProjectStatus;
18
+ reason: 'allJobsCompleted' | 'artistCanceled';
19
+ network: SupernetType;
20
+ txId: string;
21
+ workerJobs: RawJob[];
22
+ completedWorkerJobs: RawJob[];
23
+ }
24
+ type RawProjectStatus = 'pending' | 'active' | 'assigned' | 'progress' | 'errored' | 'completed' | 'cancelled';
25
+ export interface Account {
26
+ id?: string;
27
+ clientSID?: number;
28
+ address?: string;
29
+ addressSID?: number;
30
+ name?: string;
31
+ username?: string;
32
+ }
33
+ export interface RawJob {
34
+ id: string;
35
+ SID: string;
36
+ imgID?: string;
37
+ worker: Account;
38
+ createTime: number;
39
+ startTime: number | null;
40
+ updateTime: number;
41
+ endTime: number;
42
+ status: WorkerJobStatus;
43
+ reason: WorkerJobReason;
44
+ performedSteps: number;
45
+ triggeredNSFWFilter: boolean;
46
+ seedUsed: number;
47
+ costActual: CostActual;
48
+ network: SupernetType;
49
+ txId?: string;
50
+ }
51
+ export interface CostActual {
52
+ costInRenderSec: string;
53
+ costInUSD: string;
54
+ costInToken: string;
55
+ calculatedStepCount?: number;
56
+ }
57
+ export type WorkerJobReason = 'artistCanceled' | 'artistDisconnected' | 'genfailure' | 'imgUploadFailure' | 'jobCompleted' | 'jobTimedOut' | 'workerDisconnected' | 'workerReconnected';
58
+ export type WorkerJobStatus = 'created' | 'queued' | 'assigned' | 'initiatingModel' | 'jobStarted' | 'jobProgress' | 'jobCompleted' | 'jobError';
59
+ export interface CostEstimate {
60
+ rate: Rate;
61
+ quote: Quote;
62
+ }
63
+ export interface Quote {
64
+ model: QuoteModel;
65
+ job: CostActual;
66
+ project: CostActual;
67
+ }
68
+ export interface QuoteModel {
69
+ weight: string;
70
+ secPerStep: string;
71
+ secPerPreview: string;
72
+ secForCN: string;
73
+ }
74
+ export interface Rate {
75
+ costPerBaseHQRenderInUSD: string;
76
+ tokenMarkePriceUSD: string;
77
+ costPerRenderSecUSD: string;
78
+ costPerRenderSecToken: string;
79
+ network: SupernetType;
80
+ networkCostMultiplier: string;
81
+ }
82
+ export interface ProjectModel {
83
+ id: string;
84
+ SID: number;
85
+ name: string;
86
+ }
87
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=RawProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RawProject.js","sourceRoot":"","sources":["../../../src/Projects/types/RawProject.ts"],"names":[],"mappings":""}
@@ -7,6 +7,7 @@ export interface EntityEvents {
7
7
  }
8
8
  declare abstract class DataEntity<D, E extends EntityEvents = EntityEvents> extends TypedEventEmitter<E> {
9
9
  protected data: D;
10
+ protected lastUpdated: Date;
10
11
  constructor(data: D);
11
12
  /**
12
13
  * @internal
@@ -8,6 +8,7 @@ const TypedEventEmitter_1 = __importDefault(require("./TypedEventEmitter"));
8
8
  class DataEntity extends TypedEventEmitter_1.default {
9
9
  constructor(data) {
10
10
  super();
11
+ this.lastUpdated = new Date();
11
12
  this.data = data;
12
13
  }
13
14
  /**
@@ -18,6 +19,7 @@ class DataEntity extends TypedEventEmitter_1.default {
18
19
  //@ts-ignore
19
20
  const changedKeys = Object.keys(delta).filter((key) => this.data[key] !== delta[key]);
20
21
  this.data = Object.assign(Object.assign({}, this.data), delta);
22
+ this.lastUpdated = new Date();
21
23
  this.emit('updated', changedKeys);
22
24
  }
23
25
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"DataEntity.js","sourceRoot":"","sources":["../../src/lib/DataEntity.ts"],"names":[],"mappings":";;;;;AAAA,mCAAmC;AACnC,4EAAoD;AASpD,MAAe,UAAqD,SAAQ,2BAAoB;IAG9F,YAAY,IAAO;QACjB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,KAAiB;QACvB,YAAY;QACZ,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,IAAI,mCAAQ,IAAI,CAAC,IAAI,GAAK,KAAK,CAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAA,kBAAS,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,kBAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"DataEntity.js","sourceRoot":"","sources":["../../src/lib/DataEntity.ts"],"names":[],"mappings":";;;;;AAAA,mCAAmC;AACnC,4EAAoD;AASpD,MAAe,UAAqD,SAAQ,2BAAoB;IAK9F,YAAY,IAAO;QACjB,KAAK,EAAE,CAAC;QAHA,gBAAW,GAAS,IAAI,IAAI,EAAE,CAAC;QAIvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,KAAiB;QACvB,YAAY;QACZ,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,IAAI,mCAAQ,IAAI,CAAC,IAAI,GAAK,KAAK,CAAE,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAA,kBAAS,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,kBAAe,UAAU,CAAC"}
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const LIB_VERSION = "0.4.0-aplha.3";
1
+ export declare const LIB_VERSION = "0.4.0-aplha.5";
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LIB_VERSION = void 0;
4
- exports.LIB_VERSION = "0.4.0-aplha.3";
4
+ exports.LIB_VERSION = "0.4.0-aplha.5";
5
5
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.4.0-aplha.3",
6
+ "version": "0.4.0-aplha.5",
7
7
  "description": "Sogni Supernet Client",
8
8
  "main": "dist/index.js",
9
9
  "types": "dist/index.d.ts",
@@ -1,5 +1,9 @@
1
1
  import DataEntity, { EntityEvents } from '../lib/DataEntity';
2
2
  import ErrorData from '../types/ErrorData';
3
+ import { RawJob, RawProject } from './types/RawProject';
4
+ import ProjectsApi from './index';
5
+ import { Logger } from '../lib/DefaultLogger';
6
+ import getUUID from '../lib/getUUID';
3
7
 
4
8
  export type JobStatus =
5
9
  | 'pending'
@@ -9,11 +13,23 @@ export type JobStatus =
9
13
  | 'failed'
10
14
  | 'canceled';
11
15
 
16
+ const JOB_STATUS_MAP: Record<RawJob['status'], JobStatus> = {
17
+ created: 'pending',
18
+ queued: 'pending',
19
+ assigned: 'initiating',
20
+ initiatingModel: 'initiating',
21
+ jobStarted: 'processing',
22
+ jobProgress: 'processing',
23
+ jobCompleted: 'completed',
24
+ jobError: 'failed'
25
+ };
26
+
12
27
  /**
13
28
  * @inline
14
29
  */
15
30
  export interface JobData {
16
31
  id: string;
32
+ projectId: string;
17
33
  status: JobStatus;
18
34
  step: number;
19
35
  stepCount: number;
@@ -32,9 +48,37 @@ export interface JobEventMap extends EntityEvents {
32
48
  failed: ErrorData;
33
49
  }
34
50
 
51
+ export interface JobOptions {
52
+ api: ProjectsApi;
53
+ logger: Logger;
54
+ }
55
+
35
56
  class Job extends DataEntity<JobData, JobEventMap> {
36
- constructor(data: JobData) {
57
+ static fromRaw(rawProject: RawProject, rawJob: RawJob, options: JobOptions) {
58
+ return new Job(
59
+ {
60
+ id: rawJob.imgID || getUUID(),
61
+ projectId: rawProject.id,
62
+ status: JOB_STATUS_MAP[rawJob.status],
63
+ step: rawJob.performedSteps,
64
+ stepCount: rawProject.stepCount,
65
+ workerName: rawJob.worker.name,
66
+ seed: rawJob.seedUsed,
67
+ isNSFW: rawJob.triggeredNSFWFilter
68
+ },
69
+ options
70
+ );
71
+ }
72
+
73
+ private readonly _api: ProjectsApi;
74
+ private readonly _logger: Logger;
75
+
76
+ constructor(data: JobData, options: JobOptions) {
37
77
  super(data);
78
+
79
+ this._api = options.api;
80
+ this._logger = options.logger;
81
+
38
82
  this.on('updated', this.handleUpdated.bind(this));
39
83
  }
40
84
 
@@ -42,6 +86,10 @@ class Job extends DataEntity<JobData, JobEventMap> {
42
86
  return this.data.id;
43
87
  }
44
88
 
89
+ get projectId() {
90
+ return this.data.projectId;
91
+ }
92
+
45
93
  /**
46
94
  * Current status of the job.
47
95
  */
@@ -49,6 +97,10 @@ class Job extends DataEntity<JobData, JobEventMap> {
49
97
  return this.data.status;
50
98
  }
51
99
 
100
+ get finished() {
101
+ return ['completed', 'failed', 'canceled'].includes(this.status);
102
+ }
103
+
52
104
  /**
53
105
  * Progress of the job in percentage (0-100).
54
106
  */
@@ -116,6 +168,35 @@ class Job extends DataEntity<JobData, JobEventMap> {
116
168
  return this.data.workerName;
117
169
  }
118
170
 
171
+ /**
172
+ * Syncs the job data with the data received from the REST API.
173
+ * @internal
174
+ * @param data
175
+ */
176
+ async _syncWithRestData(data: RawJob) {
177
+ const delta: Partial<JobData> = {
178
+ step: data.performedSteps,
179
+ workerName: data.worker.name,
180
+ seed: data.seedUsed,
181
+ isNSFW: data.triggeredNSFWFilter
182
+ };
183
+ if (JOB_STATUS_MAP[data.status]) {
184
+ delta.status = JOB_STATUS_MAP[data.status];
185
+ }
186
+ if (!this.data.resultUrl && delta.status === 'completed' && !data.triggeredNSFWFilter) {
187
+ try {
188
+ delta.resultUrl = await this._api.downloadUrl({
189
+ jobId: this.projectId,
190
+ imageId: this.id,
191
+ type: 'complete'
192
+ });
193
+ } catch (error) {
194
+ this._logger.error(error);
195
+ }
196
+ }
197
+ this._update(delta);
198
+ }
199
+
119
200
  private handleUpdated(keys: string[]) {
120
201
  if (keys.includes('step') || keys.includes('stepCount')) {
121
202
  this.emit('progress', this.progress);
@@ -1,11 +1,34 @@
1
- import Job, { JobData } from './Job';
1
+ import Job, { JobData, JobStatus } from './Job';
2
2
  import DataEntity, { EntityEvents } from '../lib/DataEntity';
3
3
  import { ProjectParams } from './types';
4
4
  import cloneDeep from 'lodash/cloneDeep';
5
5
  import ErrorData from '../types/ErrorData';
6
6
  import getUUID from '../lib/getUUID';
7
+ import { RawJob, RawProject } from './types/RawProject';
8
+ import ProjectsApi from './index';
9
+ import { Logger } from '../lib/DefaultLogger';
7
10
 
8
- export type ProjectStatus = 'pending' | 'queued' | 'processing' | 'completed' | 'failed';
11
+ // If project is not finished and had no updates for 1 minute, force refresh
12
+ const PROJECT_TIMEOUT = 60 * 1000;
13
+ const MAX_FAILED_SYNC_ATTEMPTS = 3;
14
+
15
+ export type ProjectStatus =
16
+ | 'pending'
17
+ | 'queued'
18
+ | 'processing'
19
+ | 'completed'
20
+ | 'failed'
21
+ | 'canceled';
22
+
23
+ const PROJECT_STATUS_MAP: Record<RawProject['status'], ProjectStatus> = {
24
+ pending: 'pending',
25
+ active: 'queued',
26
+ assigned: 'processing',
27
+ progress: 'processing',
28
+ completed: 'completed',
29
+ errored: 'failed',
30
+ cancelled: 'canceled'
31
+ };
9
32
 
10
33
  /**
11
34
  * @inline
@@ -31,11 +54,20 @@ export interface ProjectEventMap extends EntityEvents {
31
54
  jobFailed: Job;
32
55
  }
33
56
 
57
+ export interface ProjectOptions {
58
+ api: ProjectsApi;
59
+ logger: Logger;
60
+ }
61
+
34
62
  class Project extends DataEntity<ProjectData, ProjectEventMap> {
35
63
  private _jobs: Job[] = [];
36
64
  private _lastEmitedProgress = -1;
65
+ private readonly _api: ProjectsApi;
66
+ private readonly _logger: Logger;
67
+ private _timeout: NodeJS.Timeout | null = null;
68
+ private _failedSyncAttempts = 0;
37
69
 
38
- constructor(data: ProjectParams) {
70
+ constructor(data: ProjectParams, options: ProjectOptions) {
39
71
  super({
40
72
  id: getUUID(),
41
73
  startedAt: new Date(),
@@ -44,6 +76,11 @@ class Project extends DataEntity<ProjectData, ProjectEventMap> {
44
76
  status: 'pending'
45
77
  });
46
78
 
79
+ this._api = options.api;
80
+ this._logger = options.logger;
81
+
82
+ this._timeout = setInterval(this._checkForTimeout.bind(this), PROJECT_TIMEOUT);
83
+
47
84
  this.on('updated', this.handleUpdated.bind(this));
48
85
  }
49
86
 
@@ -59,6 +96,10 @@ class Project extends DataEntity<ProjectData, ProjectEventMap> {
59
96
  return this.data.status;
60
97
  }
61
98
 
99
+ get finished() {
100
+ return ['completed', 'failed', 'canceled'].includes(this.status);
101
+ }
102
+
62
103
  get error() {
63
104
  return this.data.error;
64
105
  }
@@ -137,6 +178,11 @@ class Project extends DataEntity<ProjectData, ProjectEventMap> {
137
178
  this.emit('progress', progress);
138
179
  this._lastEmitedProgress = progress;
139
180
  }
181
+ // If project is finished stop watching for timeout
182
+ if (this._timeout && this.finished) {
183
+ clearInterval(this._timeout!);
184
+ this._timeout = null;
185
+ }
140
186
  if (keys.includes('status') || keys.includes('jobs')) {
141
187
  const allJobsDone = this.jobs.every((job) =>
142
188
  ['completed', 'failed', 'canceled'].includes(job.status)
@@ -155,21 +201,104 @@ class Project extends DataEntity<ProjectData, ProjectEventMap> {
155
201
  * @internal
156
202
  * @param data
157
203
  */
158
- _addJob(data: JobData) {
159
- const job = new Job(data);
204
+ _addJob(data: JobData | Job) {
205
+ const job =
206
+ data instanceof Job ? data : new Job(data, { api: this._api, logger: this._logger });
160
207
  this._jobs.push(job);
161
208
  job.on('updated', () => {
209
+ this.lastUpdated = new Date();
162
210
  this.emit('updated', ['jobs']);
163
211
  });
164
212
  job.on('completed', () => {
165
213
  this.emit('jobCompleted', job);
214
+ this._handleJobFinished(job);
166
215
  });
167
216
  job.on('failed', () => {
168
217
  this.emit('jobFailed', job);
218
+ this._handleJobFinished(job);
169
219
  });
170
220
  return job;
171
221
  }
172
222
 
223
+ private _handleJobFinished(job: Job) {
224
+ const finalStatus: JobStatus[] = ['completed', 'failed', 'canceled'];
225
+ const allJobsDone = this.jobs.every((job) => finalStatus.includes(job.status));
226
+ // If all jobs are done and project is not already failed or completed, update the project status
227
+ if (allJobsDone && this.status !== 'failed' && this.status !== 'completed') {
228
+ const allJobsFailed = this.jobs.every((job) => job.status === 'failed');
229
+ if (allJobsFailed) {
230
+ this._update({ status: 'failed' });
231
+ } else {
232
+ this._update({ status: 'completed' });
233
+ }
234
+ }
235
+ }
236
+
237
+ private _checkForTimeout() {
238
+ if (this.lastUpdated.getTime() + PROJECT_TIMEOUT < Date.now()) {
239
+ this._syncToServer().catch((error) => {
240
+ this._logger.error(error);
241
+ this._failedSyncAttempts++;
242
+ if (this._failedSyncAttempts > MAX_FAILED_SYNC_ATTEMPTS) {
243
+ this._logger.error(
244
+ `Failed to sync project data after ${MAX_FAILED_SYNC_ATTEMPTS} attempts. Stopping further attempts.`
245
+ );
246
+ clearInterval(this._timeout!);
247
+ this._timeout = null;
248
+ }
249
+ });
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Sync project data with the data received from the REST API.
255
+ * @internal
256
+ */
257
+ async _syncToServer() {
258
+ const data = await this._api.get(this.id);
259
+ const jobData = data.completedWorkerJobs.reduce((acc: Record<string, RawJob>, job) => {
260
+ const jobId = job.imgID || getUUID();
261
+ acc[jobId] = job;
262
+ return acc;
263
+ }, {});
264
+ for (const job of this._jobs) {
265
+ const restJob = jobData[job.id];
266
+ // This should never happen, but just in case we log a warning
267
+ if (!restJob) {
268
+ this._logger.warn(`Job with id ${job.id} not found in the REST project data`);
269
+ return;
270
+ }
271
+ try {
272
+ await job._syncWithRestData(restJob);
273
+ } catch (error) {
274
+ this._logger.error(error);
275
+ this._logger.error(`Failed to sync job ${job.id}`);
276
+ }
277
+ delete jobData[job.id];
278
+ }
279
+
280
+ // If there are any jobs left in jobData, it means they are new jobs that are not in the project yet
281
+ if (Object.keys(jobData).length) {
282
+ for (const job of Object.values(jobData)) {
283
+ const jobInstance = Job.fromRaw(data, job, { api: this._api, logger: this._logger });
284
+ this._addJob(jobInstance);
285
+ }
286
+ }
287
+
288
+ const delta: Partial<ProjectData> = {
289
+ params: {
290
+ ...this.data.params,
291
+ numberOfImages: data.imageCount,
292
+ steps: data.stepCount,
293
+ numberOfPreviews: data.previewCount
294
+ }
295
+ };
296
+ if (PROJECT_STATUS_MAP[data.status]) {
297
+ delta.status = PROJECT_STATUS_MAP[data.status];
298
+ }
299
+ this._update(delta);
300
+ }
301
+
173
302
  /**
174
303
  * Get full project data snapshot. Can be used to serialize the project and store it in a database.
175
304
  */
@@ -14,6 +14,7 @@ import { ApiError, ApiReponse } from '../ApiClient';
14
14
  import { EstimationResponse } from './types/EstimationResponse';
15
15
  import { JobEvent, ProjectApiEvents, ProjectEvent } from './types/events';
16
16
  import getUUID from '../lib/getUUID';
17
+ import { RawProject } from './types/RawProject';
17
18
 
18
19
  const GARBAGE_COLLECT_TIMEOUT = 10000;
19
20
 
@@ -188,7 +189,11 @@ class ProjectsApi extends ApiGroup<ProjectApiEvents> {
188
189
  error: event.error
189
190
  });
190
191
  }
191
- if (project.status === 'completed' || project.status === 'failed') {
192
+ if (project.finished) {
193
+ // Sync project data with the server and remove it from the list after some time
194
+ project._syncToServer().catch((e) => {
195
+ this.client.logger.error(e);
196
+ });
192
197
  setTimeout(() => {
193
198
  this.projects = this.projects.filter((p) => p.id !== event.projectId);
194
199
  }, GARBAGE_COLLECT_TIMEOUT);
@@ -204,6 +209,7 @@ class ProjectsApi extends ApiGroup<ProjectApiEvents> {
204
209
  if (!job) {
205
210
  job = project._addJob({
206
211
  id: event.jobId,
212
+ projectId: event.projectId,
207
213
  status: 'pending',
208
214
  step: 0,
209
215
  stepCount: project.params.steps
@@ -284,7 +290,7 @@ class ProjectsApi extends ApiGroup<ProjectApiEvents> {
284
290
  * @param data
285
291
  */
286
292
  async create(data: ProjectParams): Promise<Project> {
287
- const project = new Project({ ...data });
293
+ const project = new Project({ ...data }, { api: this, logger: this.client.logger });
288
294
  if (data.startingImage) {
289
295
  await this.uploadGuideImage(project.id, data.startingImage);
290
296
  }
@@ -294,6 +300,19 @@ class ProjectsApi extends ApiGroup<ProjectApiEvents> {
294
300
  return project;
295
301
  }
296
302
 
303
+ /**
304
+ * Get project by id, this API returns project data from the server only if the project is
305
+ * completed or failed. If the project is still processing, it will throw 404 error.
306
+ * @internal
307
+ * @param projectId
308
+ */
309
+ async get(projectId: string) {
310
+ const { data } = await this.client.rest.get<ApiReponse<RawProject>>(
311
+ `/v1/projects/${projectId}`
312
+ );
313
+ return data;
314
+ }
315
+
297
316
  private async uploadGuideImage(projectId: string, file: File | Buffer | Blob) {
298
317
  const imageId = getUUID();
299
318
  const presignedUrl = await this.uploadUrl({
@@ -336,7 +355,12 @@ class ProjectsApi extends ApiGroup<ProjectApiEvents> {
336
355
  };
337
356
  }
338
357
 
339
- private async uploadUrl(params: ImageUrlParams) {
358
+ /**
359
+ * Get upload URL for image
360
+ * @internal
361
+ * @param params
362
+ */
363
+ async uploadUrl(params: ImageUrlParams) {
340
364
  const r = await this.client.rest.get<ApiReponse<{ uploadUrl: string }>>(
341
365
  `/v1/image/uploadUrl`,
342
366
  params
@@ -344,7 +368,12 @@ class ProjectsApi extends ApiGroup<ProjectApiEvents> {
344
368
  return r.data.uploadUrl;
345
369
  }
346
370
 
347
- private async downloadUrl(params: ImageUrlParams) {
371
+ /**
372
+ * Get download URL for image
373
+ * @internal
374
+ * @param params
375
+ */
376
+ async downloadUrl(params: ImageUrlParams) {
348
377
  const r = await this.client.rest.get<ApiReponse<{ downloadUrl: string }>>(
349
378
  `/v1/image/downloadUrl`,
350
379
  params
@@ -0,0 +1,121 @@
1
+ import { SupernetType } from '../../ApiClient/WebSocketClient/types';
2
+
3
+ export interface RawProject {
4
+ id: string;
5
+ SID: number;
6
+ artist: Account;
7
+ model: ProjectModel;
8
+ imageCount: number;
9
+ stepCount: number;
10
+ previewCount: number;
11
+ hasGuideImage: boolean;
12
+ denoiseStrength: string;
13
+ costEstimate: CostEstimate;
14
+ costActual: CostActual;
15
+ createTime: number;
16
+ updateTime: number;
17
+ endTime: number;
18
+ status: RawProjectStatus;
19
+ reason: 'allJobsCompleted' | 'artistCanceled';
20
+ network: SupernetType;
21
+ txId: string;
22
+ workerJobs: RawJob[];
23
+ completedWorkerJobs: RawJob[];
24
+ }
25
+
26
+ type RawProjectStatus =
27
+ | 'pending'
28
+ | 'active'
29
+ | 'assigned'
30
+ | 'progress'
31
+ | 'errored'
32
+ | 'completed'
33
+ | 'cancelled';
34
+
35
+ export interface Account {
36
+ id?: string;
37
+ clientSID?: number;
38
+ address?: string;
39
+ addressSID?: number;
40
+ name?: string;
41
+ username?: string;
42
+ }
43
+
44
+ export interface RawJob {
45
+ id: string;
46
+ SID: string;
47
+ imgID?: string;
48
+ worker: Account;
49
+ createTime: number;
50
+ startTime: number | null;
51
+ updateTime: number;
52
+ endTime: number;
53
+ status: WorkerJobStatus;
54
+ reason: WorkerJobReason;
55
+ performedSteps: number;
56
+ triggeredNSFWFilter: boolean;
57
+ seedUsed: number;
58
+ costActual: CostActual;
59
+ network: SupernetType;
60
+ txId?: string;
61
+ }
62
+
63
+ export interface CostActual {
64
+ costInRenderSec: string;
65
+ costInUSD: string;
66
+ costInToken: string;
67
+ calculatedStepCount?: number;
68
+ }
69
+
70
+ export type WorkerJobReason =
71
+ | 'artistCanceled'
72
+ | 'artistDisconnected'
73
+ | 'genfailure'
74
+ | 'imgUploadFailure'
75
+ | 'jobCompleted'
76
+ | 'jobTimedOut'
77
+ | 'workerDisconnected'
78
+ | 'workerReconnected';
79
+
80
+ export type WorkerJobStatus =
81
+ | 'created'
82
+ | 'queued'
83
+ | 'assigned'
84
+ | 'initiatingModel'
85
+ | 'jobStarted'
86
+ | 'jobProgress'
87
+ | 'jobCompleted'
88
+ | 'jobError';
89
+
90
+ export interface CostEstimate {
91
+ rate: Rate;
92
+ quote: Quote;
93
+ }
94
+
95
+ export interface Quote {
96
+ model: QuoteModel;
97
+ job: CostActual;
98
+ project: CostActual;
99
+ }
100
+
101
+ export interface QuoteModel {
102
+ weight: string;
103
+ secPerStep: string;
104
+ secPerPreview: string;
105
+ secForCN: string;
106
+ }
107
+
108
+ export interface Rate {
109
+ costPerBaseHQRenderInUSD: string;
110
+ tokenMarkePriceUSD: string;
111
+ costPerRenderSecUSD: string;
112
+ costPerRenderSecToken: string;
113
+ network: SupernetType;
114
+ networkCostMultiplier: string;
115
+ }
116
+
117
+ export interface ProjectModel {
118
+ id: string;
119
+ SID: number;
120
+ name: string;
121
+ }
@@ -11,6 +11,8 @@ export interface EntityEvents {
11
11
  abstract class DataEntity<D, E extends EntityEvents = EntityEvents> extends TypedEventEmitter<E> {
12
12
  protected data: D;
13
13
 
14
+ protected lastUpdated: Date = new Date();
15
+
14
16
  constructor(data: D) {
15
17
  super();
16
18
  this.data = data;
@@ -24,6 +26,7 @@ abstract class DataEntity<D, E extends EntityEvents = EntityEvents> extends Type
24
26
  //@ts-ignore
25
27
  const changedKeys = Object.keys(delta).filter((key) => this.data[key] !== delta[key]);
26
28
  this.data = { ...this.data, ...delta };
29
+ this.lastUpdated = new Date();
27
30
  this.emit('updated', changedKeys);
28
31
  }
29
32
 
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const LIB_VERSION = "0.4.0-aplha.3";
1
+ export const LIB_VERSION = "0.4.0-aplha.5";