@sogni-ai/sogni-client 1.0.0-alpha.3 → 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/CHANGELOG.md +6 -0
- package/dist/Account/CurrentAccount.d.ts +5 -4
- package/dist/Account/CurrentAccount.js +29 -9
- package/dist/Account/CurrentAccount.js.map +1 -1
- package/dist/Account/index.d.ts +3 -5
- package/dist/Account/index.js +9 -20
- package/dist/Account/index.js.map +1 -1
- package/dist/Account/types.d.ts +0 -2
- package/dist/ApiClient/WebSocketClient/index.d.ts +4 -4
- package/dist/ApiClient/WebSocketClient/index.js +49 -33
- package/dist/ApiClient/WebSocketClient/index.js.map +1 -1
- package/dist/ApiClient/index.d.ts +10 -4
- package/dist/ApiClient/index.js +17 -26
- package/dist/ApiClient/index.js.map +1 -1
- package/dist/Projects/createJobRequestMessage.js +1 -1
- package/dist/Projects/createJobRequestMessage.js.map +1 -1
- package/dist/Projects/index.d.ts +2 -27
- package/dist/Projects/index.js +14 -94
- package/dist/Projects/index.js.map +1 -1
- package/dist/Projects/models.json +8906 -0
- package/dist/Projects/types/index.d.ts +0 -32
- package/dist/lib/RestClient.d.ts +7 -4
- package/dist/lib/RestClient.js +7 -7
- package/dist/lib/RestClient.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +6 -1
- package/src/Account/CurrentAccount.ts +33 -12
- package/src/Account/index.ts +8 -18
- package/src/Account/types.ts +0 -2
- package/src/ApiClient/WebSocketClient/index.ts +25 -16
- package/src/ApiClient/index.ts +27 -19
- package/src/Projects/createJobRequestMessage.ts +1 -2
- package/src/Projects/index.ts +8 -97
- package/src/Projects/models.json +8906 -0
- package/src/Projects/types/index.ts +0 -34
- package/src/lib/RestClient.ts +13 -8
- package/src/version.ts +1 -1
- package/dist/lib/AuthManager.d.ts +0 -51
- package/dist/lib/AuthManager.js +0 -157
- package/dist/lib/AuthManager.js.map +0 -1
- package/dist/lib/Cache.d.ts +0 -9
- package/dist/lib/Cache.js +0 -30
- package/dist/lib/Cache.js.map +0 -1
- package/dist/lib/utils.d.ts +0 -8
- package/dist/lib/utils.js +0 -20
- package/dist/lib/utils.js.map +0 -1
- package/src/lib/AuthManager.ts +0 -172
- package/src/lib/Cache.ts +0 -36
- package/src/lib/utils.ts +0 -17
|
@@ -1,26 +1,11 @@
|
|
|
1
1
|
import { SupernetType } from '../../ApiClient/WebSocketClient/types';
|
|
2
2
|
|
|
3
|
-
export interface SupportedModel {
|
|
4
|
-
id: string;
|
|
5
|
-
name: string;
|
|
6
|
-
SID: number;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
3
|
export interface AvailableModel {
|
|
10
4
|
id: string;
|
|
11
5
|
name: string;
|
|
12
6
|
workerCount: number;
|
|
13
7
|
}
|
|
14
8
|
|
|
15
|
-
export interface SizePreset {
|
|
16
|
-
label: string;
|
|
17
|
-
id: string;
|
|
18
|
-
width: number;
|
|
19
|
-
height: number;
|
|
20
|
-
ratio: string;
|
|
21
|
-
aspect: string;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
9
|
export interface AiModel {
|
|
25
10
|
isSD3: boolean;
|
|
26
11
|
modelShortName: string;
|
|
@@ -123,11 +108,6 @@ export interface ProjectParams {
|
|
|
123
108
|
* Time step spacing method
|
|
124
109
|
*/
|
|
125
110
|
timeStepSpacing?: TimeStepSpacing;
|
|
126
|
-
/**
|
|
127
|
-
* Size preset ID to use. You can query available size presets
|
|
128
|
-
* from `client.projects.sizePresets(network, modelId)`
|
|
129
|
-
*/
|
|
130
|
-
sizePreset?: string;
|
|
131
111
|
}
|
|
132
112
|
|
|
133
113
|
export type ImageUrlParams = {
|
|
@@ -167,18 +147,4 @@ export interface EstimateRequest {
|
|
|
167
147
|
* How strong effect of starting image should be. From 0 to 1, default 0.5
|
|
168
148
|
*/
|
|
169
149
|
startingImageStrength?: number;
|
|
170
|
-
/**
|
|
171
|
-
* Size preset ID
|
|
172
|
-
*/
|
|
173
|
-
sizePreset?: string;
|
|
174
|
-
/**
|
|
175
|
-
* Size preset image width, if not using size preset
|
|
176
|
-
* @internal
|
|
177
|
-
*/
|
|
178
|
-
width?: number;
|
|
179
|
-
/**
|
|
180
|
-
* Size preset image height, if not using size preset
|
|
181
|
-
* @internal
|
|
182
|
-
*/
|
|
183
|
-
height?: number;
|
|
184
150
|
}
|
package/src/lib/RestClient.ts
CHANGED
|
@@ -2,24 +2,30 @@ import { ApiError, ApiErrorResponse } from '../ApiClient';
|
|
|
2
2
|
import TypedEventEmitter, { EventMap } from './TypedEventEmitter';
|
|
3
3
|
import { JSONValue } from '../types/json';
|
|
4
4
|
import { Logger } from './DefaultLogger';
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
export interface AuthData {
|
|
7
|
+
token: string;
|
|
8
|
+
}
|
|
6
9
|
|
|
7
10
|
class RestClient<E extends EventMap = never> extends TypedEventEmitter<E> {
|
|
8
11
|
readonly baseUrl: string;
|
|
9
|
-
protected _auth:
|
|
12
|
+
protected _auth: AuthData | null = null;
|
|
10
13
|
protected _logger: Logger;
|
|
11
14
|
|
|
12
|
-
constructor(baseUrl: string,
|
|
15
|
+
constructor(baseUrl: string, logger: Logger) {
|
|
13
16
|
super();
|
|
14
17
|
this.baseUrl = baseUrl;
|
|
15
|
-
this._auth = auth;
|
|
16
18
|
this._logger = logger;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
|
-
get auth():
|
|
21
|
+
get auth(): AuthData | null {
|
|
20
22
|
return this._auth;
|
|
21
23
|
}
|
|
22
24
|
|
|
25
|
+
set auth(auth: AuthData | null) {
|
|
26
|
+
this._auth = auth;
|
|
27
|
+
}
|
|
28
|
+
|
|
23
29
|
private formatUrl(relativeUrl: string, query: Record<string, string> = {}): string {
|
|
24
30
|
const url = new URL(relativeUrl, this.baseUrl);
|
|
25
31
|
Object.keys(query).forEach((key) => {
|
|
@@ -28,13 +34,12 @@ class RestClient<E extends EventMap = never> extends TypedEventEmitter<E> {
|
|
|
28
34
|
return url.toString();
|
|
29
35
|
}
|
|
30
36
|
|
|
31
|
-
private
|
|
32
|
-
const token = await this.auth.getToken();
|
|
37
|
+
private request<T = JSONValue>(url: string, options: RequestInit = {}): Promise<T> {
|
|
33
38
|
return fetch(url, {
|
|
34
39
|
...options,
|
|
35
40
|
headers: {
|
|
36
41
|
...(options.headers || {}),
|
|
37
|
-
...(
|
|
42
|
+
...(this.auth ? { Authorization: this.auth.token } : {})
|
|
38
43
|
}
|
|
39
44
|
}).then((r) => this.processResponse(r) as T);
|
|
40
45
|
}
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const LIB_VERSION = "1.0.0
|
|
1
|
+
export const LIB_VERSION = "1.0.0";
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { ApiErrorResponse } from '../ApiClient';
|
|
2
|
-
import { Logger } from './DefaultLogger';
|
|
3
|
-
import TypedEventEmitter from './TypedEventEmitter';
|
|
4
|
-
/**
|
|
5
|
-
* Tokens object, containing the token and refresh token
|
|
6
|
-
* @typedef {Object} Tokens
|
|
7
|
-
* @property {string} [token] - The JWT token. Optonal, if missing it will be retrieved from the server
|
|
8
|
-
* @property {string} refreshToken - The refresh token
|
|
9
|
-
*/
|
|
10
|
-
export interface Tokens {
|
|
11
|
-
token?: string;
|
|
12
|
-
refreshToken: string;
|
|
13
|
-
}
|
|
14
|
-
export type AuthUpdatedEvent = {
|
|
15
|
-
token: string;
|
|
16
|
-
refreshToken: string;
|
|
17
|
-
walletAddress: string;
|
|
18
|
-
} | {
|
|
19
|
-
token: null;
|
|
20
|
-
refreshToken: null;
|
|
21
|
-
walletAddress: null;
|
|
22
|
-
};
|
|
23
|
-
interface AuthManagerEvents {
|
|
24
|
-
updated: AuthUpdatedEvent;
|
|
25
|
-
refreshFailed: ApiErrorResponse;
|
|
26
|
-
}
|
|
27
|
-
declare class AuthManager extends TypedEventEmitter<AuthManagerEvents> {
|
|
28
|
-
private _token?;
|
|
29
|
-
private _tokenExpiresAt;
|
|
30
|
-
private _refreshToken?;
|
|
31
|
-
private _refreshTokenExpiresAt;
|
|
32
|
-
private _logger;
|
|
33
|
-
private _baseUrl;
|
|
34
|
-
private _walletAddress?;
|
|
35
|
-
private _renewTokenPromise?;
|
|
36
|
-
constructor(baseUrl: string, logger: Logger);
|
|
37
|
-
get refreshToken(): string | undefined;
|
|
38
|
-
get walletAddress(): string | undefined;
|
|
39
|
-
get isAuthenticated(): boolean;
|
|
40
|
-
private _updateCookies;
|
|
41
|
-
setTokens({ refreshToken, token }: {
|
|
42
|
-
refreshToken: string;
|
|
43
|
-
token?: string;
|
|
44
|
-
}): Promise<void>;
|
|
45
|
-
getToken(): Promise<string | undefined>;
|
|
46
|
-
renewToken(): Promise<string>;
|
|
47
|
-
clear(): void;
|
|
48
|
-
private _updateTokens;
|
|
49
|
-
private _renewToken;
|
|
50
|
-
}
|
|
51
|
-
export default AuthManager;
|
package/dist/lib/AuthManager.js
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
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
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const utils_1 = require("./utils");
|
|
16
|
-
const ApiClient_1 = require("../ApiClient");
|
|
17
|
-
const isNodejs_1 = __importDefault(require("./isNodejs"));
|
|
18
|
-
const js_cookie_1 = __importDefault(require("js-cookie"));
|
|
19
|
-
const TypedEventEmitter_1 = __importDefault(require("./TypedEventEmitter"));
|
|
20
|
-
class AuthManager extends TypedEventEmitter_1.default {
|
|
21
|
-
constructor(baseUrl, logger) {
|
|
22
|
-
super();
|
|
23
|
-
this._tokenExpiresAt = new Date(0);
|
|
24
|
-
this._refreshTokenExpiresAt = new Date(0);
|
|
25
|
-
this._logger = logger;
|
|
26
|
-
this._baseUrl = baseUrl;
|
|
27
|
-
}
|
|
28
|
-
get refreshToken() {
|
|
29
|
-
return this._refreshToken;
|
|
30
|
-
}
|
|
31
|
-
get walletAddress() {
|
|
32
|
-
return this._walletAddress;
|
|
33
|
-
}
|
|
34
|
-
get isAuthenticated() {
|
|
35
|
-
return !!this._refreshToken && this._refreshTokenExpiresAt > new Date();
|
|
36
|
-
}
|
|
37
|
-
_updateCookies() {
|
|
38
|
-
if (isNodejs_1.default) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const token = this._token;
|
|
42
|
-
if (token) {
|
|
43
|
-
js_cookie_1.default.set('authorization', token, {
|
|
44
|
-
domain: '.sogni.ai',
|
|
45
|
-
expires: 1
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
js_cookie_1.default.remove('authorization', {
|
|
50
|
-
domain: '.sogni.ai'
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
setTokens(_a) {
|
|
55
|
-
return __awaiter(this, arguments, void 0, function* ({ refreshToken, token }) {
|
|
56
|
-
if (token) {
|
|
57
|
-
this._updateTokens({ token, refreshToken });
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
this._refreshToken = refreshToken;
|
|
61
|
-
const { expiresAt: refreshExpiresAt } = (0, utils_1.decodeRefreshToken)(refreshToken);
|
|
62
|
-
this._refreshTokenExpiresAt = refreshExpiresAt;
|
|
63
|
-
yield this.renewToken();
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
getToken() {
|
|
67
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
-
//If there is a token, and it is not expired, return it
|
|
69
|
-
if (this._token && this._tokenExpiresAt > new Date()) {
|
|
70
|
-
return this._token;
|
|
71
|
-
}
|
|
72
|
-
//If there is no refresh token, return undefined, to make unauthorized requests
|
|
73
|
-
if (!this._refreshToken) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
//If there is a refresh token, try to renew the token
|
|
77
|
-
return this.renewToken();
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
renewToken() {
|
|
81
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
-
if (this._renewTokenPromise) {
|
|
83
|
-
return this._renewTokenPromise;
|
|
84
|
-
}
|
|
85
|
-
this._renewTokenPromise = this._renewToken();
|
|
86
|
-
this._renewTokenPromise.finally(() => {
|
|
87
|
-
this._renewTokenPromise = undefined;
|
|
88
|
-
});
|
|
89
|
-
return this._renewTokenPromise;
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
clear() {
|
|
93
|
-
// Prevent duplicate events
|
|
94
|
-
if (!this._token && !this._refreshToken) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
this._refreshToken = undefined;
|
|
98
|
-
this._refreshTokenExpiresAt = new Date(0);
|
|
99
|
-
this._token = undefined;
|
|
100
|
-
this._tokenExpiresAt = new Date(0);
|
|
101
|
-
this._walletAddress = undefined;
|
|
102
|
-
this.emit('updated', { token: null, refreshToken: null, walletAddress: null });
|
|
103
|
-
}
|
|
104
|
-
_updateTokens({ token, refreshToken }) {
|
|
105
|
-
// Prevent duplicate events
|
|
106
|
-
if (this._token === token && this._refreshToken === refreshToken) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
this._token = token;
|
|
110
|
-
const { expiresAt, walletAddress } = (0, utils_1.decodeToken)(token);
|
|
111
|
-
this._walletAddress = walletAddress;
|
|
112
|
-
this._tokenExpiresAt = expiresAt;
|
|
113
|
-
this._refreshToken = refreshToken;
|
|
114
|
-
const { expiresAt: refreshExpiresAt } = (0, utils_1.decodeRefreshToken)(refreshToken);
|
|
115
|
-
this._refreshTokenExpiresAt = refreshExpiresAt;
|
|
116
|
-
this._updateCookies();
|
|
117
|
-
this.emit('updated', { token, refreshToken, walletAddress });
|
|
118
|
-
}
|
|
119
|
-
_renewToken() {
|
|
120
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
121
|
-
if (this._refreshTokenExpiresAt < new Date()) {
|
|
122
|
-
throw new Error('Refresh token expired');
|
|
123
|
-
}
|
|
124
|
-
const url = new URL('/v1/account/refresh-token', this._baseUrl).toString();
|
|
125
|
-
const response = yield fetch(url, {
|
|
126
|
-
method: 'POST',
|
|
127
|
-
headers: {
|
|
128
|
-
'Content-Type': 'application/json'
|
|
129
|
-
},
|
|
130
|
-
body: JSON.stringify({ refreshToken: this._refreshToken })
|
|
131
|
-
});
|
|
132
|
-
let responseData;
|
|
133
|
-
try {
|
|
134
|
-
responseData = yield response.json();
|
|
135
|
-
}
|
|
136
|
-
catch (e) {
|
|
137
|
-
this.emit('refreshFailed', {
|
|
138
|
-
status: 'error',
|
|
139
|
-
errorCode: 0,
|
|
140
|
-
message: 'Failed to parse response'
|
|
141
|
-
});
|
|
142
|
-
this._logger.error('Failed to parse response:', e);
|
|
143
|
-
throw new Error('Failed to parse response');
|
|
144
|
-
}
|
|
145
|
-
if (!response.ok) {
|
|
146
|
-
this.emit('refreshFailed', responseData);
|
|
147
|
-
this.clear();
|
|
148
|
-
throw new ApiClient_1.ApiError(response.status, responseData);
|
|
149
|
-
}
|
|
150
|
-
const { token, refreshToken } = responseData.data;
|
|
151
|
-
this._updateTokens({ token, refreshToken });
|
|
152
|
-
return this._token;
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
exports.default = AuthManager;
|
|
157
|
-
//# sourceMappingURL=AuthManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../../src/lib/AuthManager.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/Cache.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/** A simple memory cache implementation. */
|
|
2
|
-
export default class Cache<V = any> {
|
|
3
|
-
readonly ttl: number;
|
|
4
|
-
private data;
|
|
5
|
-
constructor(defaultTTL: number);
|
|
6
|
-
write(key: string, value: V, ttl?: number): void;
|
|
7
|
-
read(key: string): V | undefined;
|
|
8
|
-
private cleanup;
|
|
9
|
-
}
|
package/dist/lib/Cache.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
/** A simple memory cache implementation. */
|
|
4
|
-
class Cache {
|
|
5
|
-
constructor(defaultTTL) {
|
|
6
|
-
this.data = new Map();
|
|
7
|
-
this.ttl = defaultTTL;
|
|
8
|
-
setInterval(() => this.cleanup(), 10000);
|
|
9
|
-
}
|
|
10
|
-
write(key, value, ttl) {
|
|
11
|
-
this.data.set(key, {
|
|
12
|
-
exp: Date.now() + (ttl || this.ttl),
|
|
13
|
-
value
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
read(key) {
|
|
17
|
-
const record = this.data.get(key);
|
|
18
|
-
return record && record.exp > Date.now() ? record.value : undefined;
|
|
19
|
-
}
|
|
20
|
-
cleanup() {
|
|
21
|
-
const now = Date.now();
|
|
22
|
-
this.data.forEach((record, key) => {
|
|
23
|
-
if (record.exp < now) {
|
|
24
|
-
this.data.delete(key);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
exports.default = Cache;
|
|
30
|
-
//# sourceMappingURL=Cache.js.map
|
package/dist/lib/Cache.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../src/lib/Cache.ts"],"names":[],"mappings":";;AAKA,4CAA4C;AAC5C,MAAqB,KAAK;IAIxB,YAAY,UAAkB;QAFtB,SAAI,GAAgC,IAAI,GAAG,EAAE,CAAC;QAGpD,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC;QACtB,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,KAAQ,EAAE,GAAY;QACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;YACnC,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,GAAW;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,MAAM,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,CAAC;IAEO,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YAChC,IAAI,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA7BD,wBA6BC"}
|
package/dist/lib/utils.d.ts
DELETED
package/dist/lib/utils.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.decodeToken = decodeToken;
|
|
4
|
-
exports.decodeRefreshToken = decodeRefreshToken;
|
|
5
|
-
const jwt_decode_1 = require("jwt-decode");
|
|
6
|
-
function decodeToken(token) {
|
|
7
|
-
const data = (0, jwt_decode_1.jwtDecode)(token);
|
|
8
|
-
return {
|
|
9
|
-
walletAddress: data.addr,
|
|
10
|
-
expiresAt: new Date(data.exp * 1000)
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
function decodeRefreshToken(token) {
|
|
14
|
-
const data = (0, jwt_decode_1.jwtDecode)(token);
|
|
15
|
-
return {
|
|
16
|
-
env: data.env,
|
|
17
|
-
expiresAt: new Date(data.exp * 1000)
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=utils.js.map
|
package/dist/lib/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":";;AAEA,kCAMC;AAED,gDAMC;AAhBD,2CAAuC;AAEvC,SAAgB,WAAW,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,IAAA,sBAAS,EAA0D,KAAK,CAAC,CAAC;IACvF,OAAO;QACL,aAAa,EAAE,IAAI,CAAC,IAAI;QACxB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,MAAM,IAAI,GAAG,IAAA,sBAAS,EAA0D,KAAK,CAAC,CAAC;IACvF,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;KACrC,CAAC;AACJ,CAAC"}
|
package/src/lib/AuthManager.ts
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import { decodeToken, decodeRefreshToken } from './utils';
|
|
2
|
-
import { ApiError, ApiErrorResponse } from '../ApiClient';
|
|
3
|
-
import { Logger } from './DefaultLogger';
|
|
4
|
-
import isNodejs from './isNodejs';
|
|
5
|
-
import Cookie from 'js-cookie';
|
|
6
|
-
import TypedEventEmitter from './TypedEventEmitter';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Tokens object, containing the token and refresh token
|
|
10
|
-
* @typedef {Object} Tokens
|
|
11
|
-
* @property {string} [token] - The JWT token. Optonal, if missing it will be retrieved from the server
|
|
12
|
-
* @property {string} refreshToken - The refresh token
|
|
13
|
-
*/
|
|
14
|
-
export interface Tokens {
|
|
15
|
-
token?: string;
|
|
16
|
-
refreshToken: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export type AuthUpdatedEvent =
|
|
20
|
-
| { token: string; refreshToken: string; walletAddress: string }
|
|
21
|
-
| { token: null; refreshToken: null; walletAddress: null };
|
|
22
|
-
|
|
23
|
-
interface AuthManagerEvents {
|
|
24
|
-
updated: AuthUpdatedEvent;
|
|
25
|
-
refreshFailed: ApiErrorResponse;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
class AuthManager extends TypedEventEmitter<AuthManagerEvents> {
|
|
29
|
-
private _token?: string;
|
|
30
|
-
private _tokenExpiresAt: Date = new Date(0);
|
|
31
|
-
private _refreshToken?: string;
|
|
32
|
-
private _refreshTokenExpiresAt: Date = new Date(0);
|
|
33
|
-
private _logger: Logger;
|
|
34
|
-
private _baseUrl: string;
|
|
35
|
-
private _walletAddress?: string;
|
|
36
|
-
private _renewTokenPromise?: Promise<string>;
|
|
37
|
-
|
|
38
|
-
constructor(baseUrl: string, logger: Logger) {
|
|
39
|
-
super();
|
|
40
|
-
this._logger = logger;
|
|
41
|
-
this._baseUrl = baseUrl;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
get refreshToken() {
|
|
45
|
-
return this._refreshToken;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
get walletAddress() {
|
|
49
|
-
return this._walletAddress;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
get isAuthenticated() {
|
|
53
|
-
return !!this._refreshToken && this._refreshTokenExpiresAt > new Date();
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
private _updateCookies() {
|
|
57
|
-
if (isNodejs) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
const token = this._token;
|
|
61
|
-
if (token) {
|
|
62
|
-
Cookie.set('authorization', token, {
|
|
63
|
-
domain: '.sogni.ai',
|
|
64
|
-
expires: 1
|
|
65
|
-
});
|
|
66
|
-
} else {
|
|
67
|
-
Cookie.remove('authorization', {
|
|
68
|
-
domain: '.sogni.ai'
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
async setTokens({ refreshToken, token }: { refreshToken: string; token?: string }) {
|
|
74
|
-
if (token) {
|
|
75
|
-
this._updateTokens({ token, refreshToken });
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
this._refreshToken = refreshToken;
|
|
79
|
-
const { expiresAt: refreshExpiresAt } = decodeRefreshToken(refreshToken);
|
|
80
|
-
this._refreshTokenExpiresAt = refreshExpiresAt;
|
|
81
|
-
await this.renewToken();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
async getToken(): Promise<string | undefined> {
|
|
85
|
-
//If there is a token, and it is not expired, return it
|
|
86
|
-
if (this._token && this._tokenExpiresAt > new Date()) {
|
|
87
|
-
return this._token;
|
|
88
|
-
}
|
|
89
|
-
//If there is no refresh token, return undefined, to make unauthorized requests
|
|
90
|
-
if (!this._refreshToken) {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
//If there is a refresh token, try to renew the token
|
|
94
|
-
return this.renewToken();
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async renewToken(): Promise<string> {
|
|
98
|
-
if (this._renewTokenPromise) {
|
|
99
|
-
return this._renewTokenPromise;
|
|
100
|
-
}
|
|
101
|
-
this._renewTokenPromise = this._renewToken();
|
|
102
|
-
this._renewTokenPromise.finally(() => {
|
|
103
|
-
this._renewTokenPromise = undefined;
|
|
104
|
-
});
|
|
105
|
-
return this._renewTokenPromise;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
clear() {
|
|
109
|
-
// Prevent duplicate events
|
|
110
|
-
if (!this._token && !this._refreshToken) {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
this._refreshToken = undefined;
|
|
114
|
-
this._refreshTokenExpiresAt = new Date(0);
|
|
115
|
-
this._token = undefined;
|
|
116
|
-
this._tokenExpiresAt = new Date(0);
|
|
117
|
-
this._walletAddress = undefined;
|
|
118
|
-
this.emit('updated', { token: null, refreshToken: null, walletAddress: null });
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
private _updateTokens({ token, refreshToken }: { token: string; refreshToken: string }) {
|
|
122
|
-
// Prevent duplicate events
|
|
123
|
-
if (this._token === token && this._refreshToken === refreshToken) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
this._token = token;
|
|
127
|
-
const { expiresAt, walletAddress } = decodeToken(token);
|
|
128
|
-
this._walletAddress = walletAddress;
|
|
129
|
-
this._tokenExpiresAt = expiresAt;
|
|
130
|
-
this._refreshToken = refreshToken;
|
|
131
|
-
const { expiresAt: refreshExpiresAt } = decodeRefreshToken(refreshToken);
|
|
132
|
-
this._refreshTokenExpiresAt = refreshExpiresAt;
|
|
133
|
-
this._updateCookies();
|
|
134
|
-
this.emit('updated', { token, refreshToken, walletAddress });
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
private async _renewToken(): Promise<string> {
|
|
138
|
-
if (this._refreshTokenExpiresAt < new Date()) {
|
|
139
|
-
throw new Error('Refresh token expired');
|
|
140
|
-
}
|
|
141
|
-
const url = new URL('/v1/account/refresh-token', this._baseUrl).toString();
|
|
142
|
-
const response = await fetch(url, {
|
|
143
|
-
method: 'POST',
|
|
144
|
-
headers: {
|
|
145
|
-
'Content-Type': 'application/json'
|
|
146
|
-
},
|
|
147
|
-
body: JSON.stringify({ refreshToken: this._refreshToken })
|
|
148
|
-
});
|
|
149
|
-
let responseData: any;
|
|
150
|
-
try {
|
|
151
|
-
responseData = await response.json();
|
|
152
|
-
} catch (e) {
|
|
153
|
-
this.emit('refreshFailed', {
|
|
154
|
-
status: 'error',
|
|
155
|
-
errorCode: 0,
|
|
156
|
-
message: 'Failed to parse response'
|
|
157
|
-
});
|
|
158
|
-
this._logger.error('Failed to parse response:', e);
|
|
159
|
-
throw new Error('Failed to parse response');
|
|
160
|
-
}
|
|
161
|
-
if (!response.ok) {
|
|
162
|
-
this.emit('refreshFailed', responseData);
|
|
163
|
-
this.clear();
|
|
164
|
-
throw new ApiError(response.status, responseData as ApiErrorResponse);
|
|
165
|
-
}
|
|
166
|
-
const { token, refreshToken } = responseData.data;
|
|
167
|
-
this._updateTokens({ token, refreshToken });
|
|
168
|
-
return this._token!;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export default AuthManager;
|
package/src/lib/Cache.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
interface CacheRecord<V = any> {
|
|
2
|
-
exp: number;
|
|
3
|
-
value: V;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
/** A simple memory cache implementation. */
|
|
7
|
-
export default class Cache<V = any> {
|
|
8
|
-
readonly ttl: number;
|
|
9
|
-
private data: Map<string, CacheRecord<V>> = new Map();
|
|
10
|
-
|
|
11
|
-
constructor(defaultTTL: number) {
|
|
12
|
-
this.ttl = defaultTTL;
|
|
13
|
-
setInterval(() => this.cleanup(), 10000);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
write(key: string, value: V, ttl?: number) {
|
|
17
|
-
this.data.set(key, {
|
|
18
|
-
exp: Date.now() + (ttl || this.ttl),
|
|
19
|
-
value
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
read(key: string): V | undefined {
|
|
24
|
-
const record = this.data.get(key);
|
|
25
|
-
return record && record.exp > Date.now() ? record.value : undefined;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
private cleanup() {
|
|
29
|
-
const now = Date.now();
|
|
30
|
-
this.data.forEach((record, key) => {
|
|
31
|
-
if (record.exp < now) {
|
|
32
|
-
this.data.delete(key);
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
}
|
package/src/lib/utils.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { jwtDecode } from 'jwt-decode';
|
|
2
|
-
|
|
3
|
-
export function decodeToken(token: string) {
|
|
4
|
-
const data = jwtDecode<{ addr: string; env: string; iat: number; exp: number }>(token);
|
|
5
|
-
return {
|
|
6
|
-
walletAddress: data.addr,
|
|
7
|
-
expiresAt: new Date(data.exp * 1000)
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function decodeRefreshToken(token: string) {
|
|
12
|
-
const data = jwtDecode<{ type: string; env: string; iat: number; exp: number }>(token);
|
|
13
|
-
return {
|
|
14
|
-
env: data.env,
|
|
15
|
-
expiresAt: new Date(data.exp * 1000)
|
|
16
|
-
};
|
|
17
|
-
}
|