larapi 0.2.18 → 0.2.20

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/lib/Http.d.ts CHANGED
@@ -1,20 +1,21 @@
1
1
  import Core from "./Core";
2
- import Queue from './Queue';
3
- import { Event, Events } from "easy-event-emitter";
4
- import type { TMethod, TParams, TData, TRequestParams, TListenerEvents, TRequestProgress, TResponseData } from "./types";
2
+ import { EventListener } from "easy-event-emitter";
3
+ import type { TMethod, TParams, TData, TListenerEvents, TRequestProgress, TResponseData } from "./types";
5
4
  declare class Http<D extends TResponseData = TResponseData, PATH = any, DATA extends ((...args: any) => any) = any> extends Core {
6
5
  private cacheIndex;
7
- currentCache?: TData;
8
- currentEvents: Events;
9
- requestParams: TRequestParams;
10
- method: TMethod;
11
- params: TParams<PATH, DATA>;
12
- path: string;
13
- queue: Queue<D>;
14
- queueName: string;
6
+ private currentCache?;
7
+ private currentEvents;
8
+ private requestParams;
9
+ private method;
10
+ private params;
11
+ private path;
12
+ private queue;
13
+ private queueName;
14
+ private _promise?;
15
15
  constructor(method: TMethod, params: TParams<PATH, DATA>, context?: Core);
16
16
  private initRequest;
17
17
  private initCache;
18
+ get promise(): Promise<DATA> | undefined;
18
19
  private initQueue;
19
20
  private setEmit;
20
21
  success(data: any): void;
@@ -26,7 +27,7 @@ declare class Http<D extends TResponseData = TResponseData, PATH = any, DATA ext
26
27
  private cuteUndifinedParams;
27
28
  request(): this;
28
29
  addHeader(key: string, value: string): this;
29
- addListener(event: TListenerEvents, callback: (data: any) => void): Event;
30
+ addListener<EVENT extends keyof TListenerEvents, DATA extends TListenerEvents[EVENT]>(event: EVENT, callback: (data: DATA) => void): EventListener;
30
31
  deleteHeader(key: string): this;
31
32
  updateCache(data: TData, fieldKey?: string | null): void;
32
33
  clearCache(data?: TData, fieldKey?: string | null): void;
package/lib/index.d.ts CHANGED
@@ -1,54 +1,61 @@
1
1
  import Core from "./Core";
2
- import type { TUser, TConfig, TMethod, TParams, TResponseData, TListenerEvents } from "./types";
3
- import type { Event } from "easy-event-emitter";
2
+ import type { TUser, TConfig, TMethod, TParams, TResponseData, TListenerEvents, TData } from "./types";
3
+ import type { EventListener } from "easy-event-emitter";
4
4
  import Http from "./Http";
5
5
  /** Laravel API Client */
6
6
  declare class API<D extends TResponseData = TResponseData, U extends TUser = TUser, S extends D['success'] = D['success']> extends Core {
7
7
  private static instance;
8
8
  private _user;
9
- token?: string;
9
+ private token?;
10
+ private csrfToken?;
10
11
  constructor(config: TConfig);
11
- http<PATH extends keyof S, DATA extends S[PATH]>(method: TMethod, params: TParams<PATH, DATA>): Http<D, PATH, DATA>;
12
- get<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA, 'GET'>): Http<D, PATH, DATA>;
13
- head<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>): Http<D, PATH, DATA>;
14
- post<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>): Http<D, PATH, DATA>;
15
- put<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>): Http<D, PATH, DATA>;
16
- patch<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>): Http<D, PATH, DATA>;
17
- delete<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>): Http<D, PATH, DATA>;
18
- options<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>): Http<D, PATH, DATA>;
19
- connect<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>): Http<D, PATH, DATA>;
20
- trace<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>): Http<D, PATH, DATA>;
21
- addListener(event: TListenerEvents, callback: (data: any) => void): Event;
22
- setToken(token: string): Promise<void>;
12
+ http<DATA extends S[PATH]['?'], PATH extends keyof S = keyof S>(method: TMethod, params: TParams<PATH, DATA>): Http<D, PATH, DATA>;
13
+ get<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA, 'GET'>): Http<D, keyof S, Data>;
14
+ head<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>): Http<D, keyof S, Data>;
15
+ post<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>): Http<D, keyof S, Data>;
16
+ put<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>): Http<D, keyof S, Data>;
17
+ patch<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>): Http<D, keyof S, Data>;
18
+ delete<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>): Http<D, keyof S, Data>;
19
+ options<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>): Http<D, keyof S, Data>;
20
+ connect<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>): Http<D, keyof S, Data>;
21
+ trace<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>): Http<D, keyof S, Data>;
22
+ addListener<EVENT extends keyof TListenerEvents, DATA extends TListenerEvents[EVENT]>(event: EVENT, callback: (data: DATA) => void): EventListener;
23
+ setToken(token: string): void;
24
+ setCSRFToken(csrfToken: string): void;
23
25
  getToken(): string | undefined;
26
+ getCSRFToken(): string | undefined;
24
27
  getUid(): number;
25
28
  getUser(): U;
26
29
  get uid(): number;
27
30
  get user(): U;
28
- setUser(user: U): Promise<void>;
31
+ setLogin(user: U, token?: string): void;
32
+ setUser(user: U): void;
29
33
  updateUser(user: U): void;
30
34
  logout(): Promise<void>;
31
- static http: <PATH extends string | number, DATA extends import("./types").TData[PATH]>(method: TMethod, params: TParams<PATH, DATA>) => Http<TResponseData, PATH, DATA>;
32
- static get: <PATH extends string | number, DATA extends import("./types").TData[PATH]>(params: TParams<PATH, DATA, "GET">) => Http<TResponseData, PATH, DATA>;
33
- static head: <PATH extends string | number, DATA extends import("./types").TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, PATH, DATA>;
34
- static post: <PATH extends string | number, DATA extends import("./types").TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, PATH, DATA>;
35
- static put: <PATH extends string | number, DATA extends import("./types").TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, PATH, DATA>;
36
- static patch: <PATH extends string | number, DATA extends import("./types").TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, PATH, DATA>;
37
- static delete: <PATH extends string | number, DATA extends import("./types").TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, PATH, DATA>;
38
- static options: <PATH extends string | number, DATA extends import("./types").TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, PATH, DATA>;
39
- static connect: <PATH extends string | number, DATA extends import("./types").TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, PATH, DATA>;
40
- static trace: <PATH extends string | number, DATA extends import("./types").TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, PATH, DATA>;
35
+ static http: <DATA extends TData[PATH]["?"], PATH extends string | number = string | number>(method: TMethod, params: TParams<PATH, DATA>) => Http<TResponseData, PATH, DATA>;
36
+ static get: <Data extends TData[PATH]["?"], PATH extends string | number = string | number, DATA extends TData[PATH] = TData[PATH]>(params: TParams<PATH, DATA, "GET">) => Http<TResponseData, string | number, Data>;
37
+ static head: <Data extends TData[PATH]["?"], PATH extends string | number = string | number, DATA extends TData[PATH] = TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, string | number, Data>;
38
+ static post: <Data extends TData[PATH]["?"], PATH extends string | number = string | number, DATA extends TData[PATH] = TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, string | number, Data>;
39
+ static put: <Data extends TData[PATH]["?"], PATH extends string | number = string | number, DATA extends TData[PATH] = TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, string | number, Data>;
40
+ static patch: <Data extends TData[PATH]["?"], PATH extends string | number = string | number, DATA extends TData[PATH] = TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, string | number, Data>;
41
+ static delete: <Data extends TData[PATH]["?"], PATH extends string | number = string | number, DATA extends TData[PATH] = TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, string | number, Data>;
42
+ static options: <Data extends TData[PATH]["?"], PATH extends string | number = string | number, DATA extends TData[PATH] = TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, string | number, Data>;
43
+ static connect: <Data extends TData[PATH]["?"], PATH extends string | number = string | number, DATA extends TData[PATH] = TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, string | number, Data>;
44
+ static trace: <Data extends TData[PATH]["?"], PATH extends string | number = string | number, DATA extends TData[PATH] = TData[PATH]>(params: TParams<PATH, DATA>) => Http<TResponseData, string | number, Data>;
41
45
  static setConfig: (config: TConfig) => void;
42
46
  static setHost: (host: string) => void;
43
- static setUser: (user: TUser) => Promise<void>;
47
+ static setUser: (user: TUser) => void;
44
48
  static updateUser: (user: TUser) => void;
45
49
  static logout: () => Promise<void>;
46
- static setToken: (token: string) => Promise<void>;
47
- static addListener: (event: TListenerEvents, callback: (data: any) => void) => Event;
50
+ static setToken: (token: string) => void;
51
+ static setLogin: (user: TUser, token?: string) => void;
52
+ static addListener: <EVENT extends keyof TListenerEvents, DATA extends TListenerEvents[EVENT]>(event: EVENT, callback: (data: DATA) => void) => EventListener;
48
53
  static setInitData: (data: import("./types").TGroupsData) => void;
54
+ static setCSRFToken: (csrfToken: string) => void;
55
+ static getCSRFToken: () => string | undefined;
49
56
  static triggerByCacheGroup: (groups: string | string[]) => void;
50
- static clearCacheGroup: (groups: string | string[], data?: import("./types").TData | undefined, fieldKey?: string | null) => void;
51
- static updateCacheGroup: (groups: string | string[], data: import("./types").TData, fieldKey?: string | null) => void;
57
+ static clearCacheGroup: (groups: string | string[], data?: TData | undefined, fieldKey?: string | null) => void;
58
+ static updateCacheGroup: (groups: string | string[], data: TData, fieldKey?: string | null) => void;
52
59
  static getToken: () => string | undefined;
53
60
  static getUid: () => number;
54
61
  static getUser: () => TUser;
@@ -57,11 +64,7 @@ declare class API<D extends TResponseData = TResponseData, U extends TUser = TUs
57
64
  /**
58
65
  * @deprecated The method should not be used
59
66
  */
60
- static deleteCacheGroup: (groups: string | string[], data?: import("./types").TData | undefined, fieldKey?: string | null) => void;
67
+ static deleteCacheGroup: (groups: string | string[], data?: TData | undefined, fieldKey?: string | null) => void;
61
68
  }
62
- export type {
63
- /**
64
- * @deprecated The type should not be used
65
- */
66
- Event, Event as EventListener, TResponseData };
69
+ export type { EventListener, TResponseData };
67
70
  export default API;
package/lib/types.d.ts CHANGED
@@ -19,6 +19,9 @@ export type TData = {
19
19
  export type TGroupsData = {
20
20
  [index: string]: TData;
21
21
  };
22
+ export type TRequestHeaders = {
23
+ [index: string]: string;
24
+ };
22
25
  export type TMethod = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'CONNECT' | 'TRACE';
23
26
  export type TCacheControll = string | {
24
27
  group: string;
@@ -44,6 +47,7 @@ export type TConfig = {
44
47
  host: string;
45
48
  reviver?: (this: any, key: string, value: any) => any;
46
49
  dataReviver?: TConfigDataReviver;
50
+ headers?: TRequestHeaders;
47
51
  };
48
52
  export type TResponseData = {
49
53
  success: TData;
@@ -58,6 +62,7 @@ export type TParams<P = string | keyof TResponseData['success'], D extends ((...
58
62
  cacheClear?: TCacheControll | TCacheControll[];
59
63
  globalName?: string;
60
64
  queueThrottling?: boolean;
65
+ headers?: TRequestHeaders;
61
66
  success?: (data: ReturnType<D>) => void;
62
67
  error?: (error: E) => void;
63
68
  fail?: (fail: F) => void;
@@ -66,10 +71,23 @@ export type TParams<P = string | keyof TResponseData['success'], D extends ((...
66
71
  };
67
72
  export type TRequestParams = {
68
73
  method: TMethod;
69
- headers?: {
70
- [index: string]: string;
71
- };
74
+ headers?: TRequestHeaders;
72
75
  body?: string;
73
76
  withoutResponse?: boolean;
74
77
  };
75
- export type TListenerEvents = 'api-request-success' | 'api-request-fail' | 'api-request-error' | 'api-request-complete' | 'api-request-progress' | 'login' | 'logout' | 'user-update';
78
+ export type TListenerEvents = {
79
+ 'api-request-success': any;
80
+ 'api-request-fail': any;
81
+ 'api-request-error': any;
82
+ 'api-request-complete': any;
83
+ 'api-request-progress': any;
84
+ 'login': {
85
+ user: any;
86
+ token: string;
87
+ };
88
+ 'logout': any;
89
+ 'user-set': any;
90
+ 'user-update': any;
91
+ 'token-update': string;
92
+ 'csrf-token-update': string;
93
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "larapi",
3
- "version": "0.2.18",
3
+ "version": "0.2.20",
4
4
  "description": "API client for laravel",
5
5
  "main": "dist/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -42,7 +42,7 @@
42
42
  "webpack-cli": "^5.1.4"
43
43
  },
44
44
  "peerDependencies": {
45
- "easy-event-emitter": "^1.0.7",
45
+ "easy-event-emitter": "^1.1.5",
46
46
  "md5": "^2.3.0"
47
47
  }
48
48
  }
package/src/Core.ts CHANGED
@@ -13,7 +13,7 @@ import type {
13
13
  abstract class Core {
14
14
  private cache: TCache;
15
15
  initData: TGroupsData;
16
- protected readonly events: Events;
16
+ protected readonly events: EventEmitter;
17
17
  config: TConfig;
18
18
 
19
19
 
package/src/Http.ts CHANGED
@@ -2,8 +2,7 @@ import md5 from 'md5';
2
2
  import Core from "./Core";
3
3
  import Queue from './Queue';
4
4
  import EventEmitter,{
5
- Event,
6
- Events
5
+ EventListener
7
6
  } from "easy-event-emitter";
8
7
  import type {
9
8
  TMethod,
@@ -18,14 +17,15 @@ import type {
18
17
 
19
18
  class Http<D extends TResponseData = TResponseData, PATH = any, DATA extends ((...args: any) => any) = any> extends Core {
20
19
  private cacheIndex: string;
21
- currentCache?: TData;
22
- currentEvents: Events
23
- requestParams: TRequestParams;
24
- method: TMethod;
25
- params: TParams<PATH, DATA>;
26
- path: string;
27
- queue: Queue<D>;
28
- queueName: string;
20
+ private currentCache?: TData;
21
+ private currentEvents: EventEmitter
22
+ private requestParams: TRequestParams;
23
+ private method: TMethod;
24
+ private params: TParams<PATH, DATA>;
25
+ private path: string;
26
+ private queue: Queue<D>;
27
+ private queueName: string;
28
+ private _promise?: Promise<DATA>;
29
29
 
30
30
  constructor(method: TMethod, params: TParams<PATH, DATA>, context?: Core) {
31
31
  super(context);
@@ -58,7 +58,8 @@ class Http<D extends TResponseData = TResponseData, PATH = any, DATA extends ((.
58
58
  private initRequest(): void {
59
59
  this.requestParams.headers = {
60
60
  'Accept': 'application/json',
61
- 'Content-Type': 'application/json'
61
+ 'Content-Type': 'application/json',
62
+ ...this.params.headers
62
63
  };
63
64
 
64
65
  this.params.data = this.params.data ? this.cuteUndifinedParams(this.params.data) : this.params.data;
@@ -103,11 +104,15 @@ class Http<D extends TResponseData = TResponseData, PATH = any, DATA extends ((.
103
104
  }
104
105
  }
105
106
 
107
+ public get promise() {
108
+ return this._promise;
109
+ }
110
+
106
111
  private initQueue(): void {
107
112
  this.queueName = this.params.queueThrottling ? md5(this.path) : this.cacheIndex;
108
113
  }
109
114
 
110
- private setEmit(event: TListenerEvents, data: any) {
115
+ private setEmit<EVENT extends keyof TListenerEvents, DATA extends TListenerEvents[EVENT]>(event: EVENT, data: DATA) {
111
116
  this.currentEvents.emit(event, data);
112
117
  this.events.emit(event, {
113
118
  cacheIndex: this.cacheIndex,
@@ -200,64 +205,79 @@ class Http<D extends TResponseData = TResponseData, PATH = any, DATA extends ((.
200
205
  public request(): this {
201
206
  if (typeof XMLHttpRequest === 'undefined' || this.currentCache || this.queue.push(this.queueName)) return this;
202
207
 
203
- try {
204
- const xhr = new XMLHttpRequest();
205
-
206
- xhr.open(this.method, this.config.host + this.path, true);
207
- for(const header in this.requestParams.headers) {
208
- xhr.setRequestHeader(header, this.requestParams.headers[header]);
209
- }
210
-
211
- if (xhr.upload) {
212
- xhr.upload.onprogress = ({lengthComputable, loaded, total}) => {
213
- if (lengthComputable) {
214
- this.progress({
215
- percent: (loaded / total * 100),
216
- total,
217
- loaded
218
- });
219
- }
220
- }
221
- }
222
-
223
- xhr.onabort = () => {
224
- this.fail({
225
- message: 'request abort'
226
- });
227
- };
228
-
229
- xhr.onerror = () => {
230
- this.error({
231
- message: 'request error'
232
- });
233
- };
234
-
235
- xhr.onreadystatechange = () => {
236
- if (xhr.readyState !== 4) return;
208
+ this._promise = new Promise((resolve, reject) => {
209
+ try {
210
+ const xhr = new XMLHttpRequest();
237
211
 
238
- const result = (!this.requestParams.withoutResponse && this.isJsonString(xhr.responseText)) ? this.jsonParse(xhr.responseText) : {};
239
-
240
- if (xhr.status >= 200 && xhr.status <= 299) {
241
- if (this.params.cache) {
242
- this.setCache(this.cacheIndex, result, (typeof this.params.cache === 'boolean' ? undefined : this.params.cache));
212
+ xhr.open(this.method, this.config.host + this.path, true);
213
+ for(const header in this.requestParams.headers) {
214
+ xhr.setRequestHeader(header, this.requestParams.headers[header]);
215
+ }
216
+
217
+ if (xhr.upload) {
218
+ xhr.upload.onprogress = ({lengthComputable, loaded, total}) => {
219
+ if (lengthComputable) {
220
+ this.progress({
221
+ percent: (loaded / total * 100),
222
+ total,
223
+ loaded
224
+ });
225
+ }
243
226
  }
244
- this.success(result);
245
- }else{
246
- if (xhr.status >= 400 && xhr.status <= 499) {
247
- this.fail(result);
227
+ }
228
+
229
+ xhr.onabort = () => {
230
+ reject({
231
+ type: 'abort',
232
+ message: 'request abort'
233
+ });
234
+ this.fail({
235
+ message: 'request abort'
236
+ });
237
+ };
238
+
239
+ xhr.onerror = () => {
240
+ reject({
241
+ type: 'error',
242
+ message: 'request error'
243
+ });
244
+ this.error({
245
+ message: 'request error'
246
+ });
247
+ };
248
+
249
+ xhr.onreadystatechange = () => {
250
+ if (xhr.readyState !== 4) return;
251
+
252
+ const result = (!this.requestParams.withoutResponse && this.isJsonString(xhr.responseText)) ? this.jsonParse(xhr.responseText) : {};
253
+
254
+ if (xhr.status >= 200 && xhr.status <= 299) {
255
+ if (this.params.cache) {
256
+ this.setCache(this.cacheIndex, result, (typeof this.params.cache === 'boolean' ? undefined : this.params.cache));
257
+ }
258
+ resolve(result);
259
+ this.success(result);
248
260
  }else{
249
- this.error(result);
250
- console.warn(result);
261
+ if (xhr.status >= 400 && xhr.status <= 499) {
262
+ reject(result);
263
+ this.fail(result);
264
+ }else{
265
+ reject(result);
266
+ this.error(result);
267
+ console.warn(result);
268
+ }
251
269
  }
270
+ this.complete(result);
271
+ this.queue.clear(this.queueName);
252
272
  }
253
- this.complete(result);
254
- this.queue.clear(this.queueName);
273
+ xhr.send(this.requestParams.body);
274
+ }catch(e) {
275
+ reject(e);
276
+ console.warn(e);
277
+ throw e;
255
278
  }
256
- xhr.send(this.requestParams.body);
257
- }catch(e) {
258
- console.warn(e);
259
- throw e;
260
- }
279
+ });
280
+
261
281
  return this
262
282
  }
263
283
 
@@ -266,7 +286,7 @@ class Http<D extends TResponseData = TResponseData, PATH = any, DATA extends ((.
266
286
  return this;
267
287
  }
268
288
 
269
- public addListener(event: TListenerEvents, callback: (data: any) => void): Event {
289
+ public addListener<EVENT extends keyof TListenerEvents, DATA extends TListenerEvents[EVENT]>(event: EVENT, callback: (data: DATA) => void): EventListener {
270
290
  return this.currentEvents.addListener(event, callback);
271
291
  }
272
292
 
package/src/index.ts CHANGED
@@ -5,10 +5,11 @@ import type {
5
5
  TMethod,
6
6
  TParams,
7
7
  TResponseData,
8
- TListenerEvents
8
+ TListenerEvents,
9
+ TData
9
10
  } from "./types";
10
11
  import type {
11
- Event
12
+ EventListener
12
13
  } from "easy-event-emitter";
13
14
  import Http from "./Http";
14
15
 
@@ -19,7 +20,8 @@ class API<D extends TResponseData = TResponseData, U extends TUser = TUser, S ex
19
20
  host: ''
20
21
  });
21
22
  private _user: U;
22
- token?: string;
23
+ private token?: string;
24
+ private csrfToken?: string;
23
25
 
24
26
  constructor(config: TConfig) {
25
27
  super();
@@ -27,10 +29,13 @@ class API<D extends TResponseData = TResponseData, U extends TUser = TUser, S ex
27
29
  this._user = {} as U;
28
30
 
29
31
  this.setToken = this.setToken.bind(this);
32
+ this.setCSRFToken = this.setCSRFToken.bind(this);
33
+ this.setLogin = this.setLogin.bind(this);
30
34
  this.setUser = this.setUser.bind(this);
31
35
  this.updateUser = this.updateUser.bind(this);
32
36
  this.logout = this.logout.bind(this);
33
37
  this.getToken = this.getToken.bind(this);
38
+ this.getCSRFToken = this.getCSRFToken.bind(this);
34
39
  this.http = this.http.bind(this);
35
40
  this.get = this.get.bind(this);
36
41
  this.head = this.head.bind(this);
@@ -46,62 +51,71 @@ class API<D extends TResponseData = TResponseData, U extends TUser = TUser, S ex
46
51
  this.addListener = this.addListener.bind(this);
47
52
  }
48
53
 
49
- public http<PATH extends keyof S, DATA extends S[PATH]>(method: TMethod, params: TParams<PATH, DATA>) {
54
+ public http<DATA extends S[PATH]['?'], PATH extends keyof S = keyof S>(method: TMethod, params: TParams<PATH, DATA>) {
50
55
  const http = new Http<D, PATH, DATA>(method, params, this);
51
- if (this.token) {
52
- http.addHeader('Authorization', 'Bearer ' + this.token);
53
- }
56
+ if (this.token) http.addHeader('Authorization', 'Bearer ' + this.token);
57
+ if (this.csrfToken) http.addHeader('X-CSRF-TOKEN', this.csrfToken);
54
58
  return http;
55
59
  }
56
60
 
57
- public get<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA, 'GET'>) {
58
- return this.http('GET', params).request();
61
+ public get<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA, 'GET'>) {
62
+ return this.http<Data>('GET', params).request();
59
63
  }
60
64
 
61
- public head<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>) {
62
- return this.http('HEAD', params).request();
65
+ public head<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>) {
66
+ return this.http<Data>('HEAD', params).request();
63
67
  }
64
68
 
65
- public post<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>) {
66
- return this.http('POST', params).request();
69
+ public post<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>) {
70
+ return this.http<Data>('POST', params).request();
67
71
  }
68
72
 
69
- public put<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>) {
70
- return this.http('PUT', params).request();
73
+ public put<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>) {
74
+ return this.http<Data>('PUT', params).request();
71
75
  }
72
76
 
73
- public patch<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>) {
74
- return this.http('PATCH', params).request();
77
+ public patch<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>) {
78
+ return this.http<Data>('PATCH', params).request();
75
79
  }
76
80
 
77
- public delete<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>) {
78
- return this.http('DELETE', params).request();
81
+ public delete<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>) {
82
+ return this.http<Data>('DELETE', params).request();
79
83
  }
80
84
 
81
- public options<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>) {
82
- return this.http('OPTIONS', params).request();
85
+ public options<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>) {
86
+ return this.http<Data>('OPTIONS', params).request();
83
87
  }
84
88
 
85
- public connect<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>) {
86
- return this.http('CONNECT', params).request();
89
+ public connect<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>) {
90
+ return this.http<Data>('CONNECT', params).request();
87
91
  }
88
92
 
89
- public trace<PATH extends keyof S, DATA extends S[PATH]>(params: TParams<PATH, DATA>) {
90
- return this.http('TRACE', params).request();
93
+ public trace<Data extends S[PATH]['?'], PATH extends keyof S = keyof S, DATA extends S[PATH] = S[PATH]>(params: TParams<PATH, DATA>) {
94
+ return this.http<Data>('TRACE', params).request();
91
95
  }
92
96
 
93
- public addListener(event: TListenerEvents, callback: (data: any) => void): Event {
97
+ public addListener<EVENT extends keyof TListenerEvents, DATA extends TListenerEvents[EVENT]>(event: EVENT, callback: (data: DATA) => void): EventListener {
94
98
  return this.events.addListener(event, callback);
95
99
  }
96
100
 
97
- public async setToken(token: string) {
101
+ public setToken(token: string) {
98
102
  this.token = token;
103
+ this.events.emit('token-update', token);
104
+ }
105
+
106
+ public setCSRFToken(csrfToken: string) {
107
+ this.csrfToken = csrfToken;
108
+ this.events.emit('csrf-token-update', csrfToken);
99
109
  }
100
110
 
101
111
  public getToken() {
102
112
  return this.token;
103
113
  }
104
114
 
115
+ public getCSRFToken() {
116
+ return this.csrfToken;
117
+ }
118
+
105
119
  public getUid(): number {
106
120
  return (typeof this._user === 'object' && 'id' in this._user) ? Number(this._user.id) : 0;
107
121
  }
@@ -118,9 +132,18 @@ class API<D extends TResponseData = TResponseData, U extends TUser = TUser, S ex
118
132
  return this.getUser();
119
133
  }
120
134
 
121
- public async setUser(user: U) {
135
+ public setLogin(user: U, token: string = '') {
136
+ this.setUser(user);
137
+ this.setToken(token);
138
+ this.events.emit('login', {
139
+ user,
140
+ token
141
+ });
142
+ }
143
+
144
+ public setUser(user: U) {
122
145
  this._user = user;
123
- this.events.emit('login', user);
146
+ this.events.emit('user-set', user);
124
147
  }
125
148
 
126
149
  public updateUser(user: U) {
@@ -152,8 +175,11 @@ class API<D extends TResponseData = TResponseData, U extends TUser = TUser, S ex
152
175
  public static updateUser = this.instance.updateUser;
153
176
  public static logout = this.instance.logout;
154
177
  public static setToken = this.instance.setToken;
178
+ public static setLogin = this.instance.setLogin;
155
179
  public static addListener = this.instance.addListener;
156
180
  public static setInitData = this.instance.setInitData;
181
+ public static setCSRFToken = this.instance.setCSRFToken;
182
+ public static getCSRFToken = this.instance.getCSRFToken;
157
183
  public static triggerByCacheGroup = this.instance.triggerByCacheGroup;
158
184
  public static clearCacheGroup = this.instance.clearCacheGroup;
159
185
  public static updateCacheGroup = this.instance.updateCacheGroup;
@@ -171,11 +197,7 @@ class API<D extends TResponseData = TResponseData, U extends TUser = TUser, S ex
171
197
 
172
198
  (globalThis as any).apiSetInitData = API.setInitData;
173
199
  export type {
174
- /**
175
- * @deprecated The type should not be used
176
- */
177
- Event,
178
- Event as EventListener,
200
+ EventListener,
179
201
  TResponseData
180
202
  };
181
203
  export default API;