@taco_tsinghua/graphnode-sdk 0.1.19 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +24 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +34 -8
- package/dist/client.js.map +1 -1
- package/dist/endpoints/notification.d.ts +1 -0
- package/dist/endpoints/notification.d.ts.map +1 -1
- package/dist/endpoints/notification.js +1 -0
- package/dist/endpoints/notification.js.map +1 -1
- package/dist/http-builder.d.ts +37 -0
- package/dist/http-builder.d.ts.map +1 -1
- package/dist/http-builder.js +6 -0
- package/dist/http-builder.js.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +43 -8
- package/src/endpoints/notification.ts +1 -0
- package/src/http-builder.ts +43 -0
package/dist/client.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { NoteApi } from './endpoints/note.js';
|
|
|
9
9
|
import { AppleAuthApi } from './endpoints/auth.apple.js';
|
|
10
10
|
import { SyncApi } from './endpoints/sync.js';
|
|
11
11
|
import { AiApi } from './endpoints/ai.js';
|
|
12
|
+
import { NotificationApi } from './endpoints/notification.js';
|
|
12
13
|
/**
|
|
13
14
|
* GraphNode 클라이언트 옵션
|
|
14
15
|
* @public
|
|
@@ -45,12 +46,33 @@ export declare class GraphNodeClient {
|
|
|
45
46
|
readonly appleAuth: AppleAuthApi;
|
|
46
47
|
readonly sync: SyncApi;
|
|
47
48
|
readonly ai: AiApi;
|
|
49
|
+
readonly notification: NotificationApi;
|
|
50
|
+
/**
|
|
51
|
+
* HTTP 요청 빌더 인스턴스.
|
|
52
|
+
* 모든 API 엔드포인트가 이 빌더를 공유하여 HTTP 요청을 수행합니다.
|
|
53
|
+
* @private
|
|
54
|
+
*/
|
|
48
55
|
private readonly rb;
|
|
56
|
+
/**
|
|
57
|
+
* 현재 설정된 Access Token (Bearer 토큰).
|
|
58
|
+
* 쿠키 인증 방식을 사용할 경우 null일 수 있습니다.
|
|
59
|
+
* @private
|
|
60
|
+
*/
|
|
49
61
|
private _accessToken;
|
|
62
|
+
/**
|
|
63
|
+
* GraphNodeClient 생성자.
|
|
64
|
+
* - 실행 환경(브라우저/Node.js)에 맞는 fetch 함수를 자동으로 감지하여 설정합니다.
|
|
65
|
+
* - 기본 API URL 및 공통 헤더 등 통신 옵션을 초기화합니다.
|
|
66
|
+
*
|
|
67
|
+
* @param opts 클라이언트 설정 옵션
|
|
68
|
+
*/
|
|
50
69
|
constructor(opts?: GraphNodeClientOptions);
|
|
51
70
|
/**
|
|
52
|
-
* Access Token을 설정합니다.
|
|
53
|
-
*
|
|
71
|
+
* Access Token을 동적으로 설정합니다.
|
|
72
|
+
* - 로그인 후 발급받은 토큰을 수동으로 설정하거나, 로그아웃 시 null로 초기화할 때 사용합니다.
|
|
73
|
+
* - 쿠키 기반 인증을 사용하는 경우, 이 함수를 호출하지 않아도(null 상태여도) 정상 동작합니다.
|
|
74
|
+
*
|
|
75
|
+
* @param token JWT Access Token 문자열 또는 null (초기화)
|
|
54
76
|
*/
|
|
55
77
|
setAccessToken(token: string | null): void;
|
|
56
78
|
}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,cAAc,EAAkB,MAAM,mBAAmB,CAAC;AAE9F,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,cAAc,EAAkB,MAAM,mBAAmB,CAAC;AAE9F,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAQ,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE/D;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,aAAa,CAAC;IAC7F,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAe;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,aAAa,EAAE,gBAAgB,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;IAEvC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAiB;IAEpC;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAAuB;IAE3C;;;;;;OAMG;gBACS,IAAI,GAAE,sBAA2B;IA8C7C;;;;;;OAMG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAGpC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,CAAC,EAAE,sBAAsB,GAAG,eAAe,CAEpF"}
|
package/dist/client.js
CHANGED
|
@@ -10,6 +10,7 @@ import { NoteApi } from './endpoints/note.js';
|
|
|
10
10
|
import { AppleAuthApi } from './endpoints/auth.apple.js';
|
|
11
11
|
import { SyncApi } from './endpoints/sync.js';
|
|
12
12
|
import { AiApi } from './endpoints/ai.js';
|
|
13
|
+
import { NotificationApi } from './endpoints/notification.js';
|
|
13
14
|
/**
|
|
14
15
|
* GraphNode API 클라이언트
|
|
15
16
|
* @public
|
|
@@ -25,28 +26,49 @@ import { AiApi } from './endpoints/ai.js';
|
|
|
25
26
|
* @property ai AI 채팅 API
|
|
26
27
|
*/
|
|
27
28
|
export class GraphNodeClient {
|
|
29
|
+
/**
|
|
30
|
+
* GraphNodeClient 생성자.
|
|
31
|
+
* - 실행 환경(브라우저/Node.js)에 맞는 fetch 함수를 자동으로 감지하여 설정합니다.
|
|
32
|
+
* - 기본 API URL 및 공통 헤더 등 통신 옵션을 초기화합니다.
|
|
33
|
+
*
|
|
34
|
+
* @param opts 클라이언트 설정 옵션
|
|
35
|
+
*/
|
|
28
36
|
constructor(opts = {}) {
|
|
37
|
+
/**
|
|
38
|
+
* 현재 설정된 Access Token (Bearer 토큰).
|
|
39
|
+
* 쿠키 인증 방식을 사용할 경우 null일 수 있습니다.
|
|
40
|
+
* @private
|
|
41
|
+
*/
|
|
29
42
|
this._accessToken = null;
|
|
43
|
+
// 1. fetch 함수 결정 전략
|
|
44
|
+
// 사용자가 opts.fetch로 직접 주입하지 않은 경우, 환경에 따라 적절한 기본 fetch를 찾습니다.
|
|
30
45
|
let fetchFn = opts.fetch;
|
|
31
46
|
if (!fetchFn) {
|
|
32
47
|
if (typeof window !== 'undefined' && window.fetch) {
|
|
33
|
-
//
|
|
34
|
-
// window.fetch
|
|
48
|
+
// [Browser / Electron Renderer 환경]
|
|
49
|
+
// window.fetch는 호출 시 'this'가 window여야 하므로 bind(window)가 필수입니다.
|
|
50
|
+
// 그냥 할당하면 "Illegal invocation" 에러가 발생할 수 있습니다.
|
|
35
51
|
fetchFn = window.fetch.bind(window);
|
|
36
52
|
}
|
|
37
53
|
else if (typeof globalThis !== 'undefined' && globalThis.fetch) {
|
|
38
|
-
//
|
|
54
|
+
// [Node.js 18+ / Bun / Deno 등 환경]
|
|
55
|
+
// 전역 스코프(globalThis)에 있는 fetch를 사용합니다.
|
|
39
56
|
fetchFn = globalThis.fetch.bind(globalThis);
|
|
40
57
|
}
|
|
41
58
|
}
|
|
42
59
|
this._accessToken = opts.accessToken ?? null;
|
|
43
|
-
//
|
|
60
|
+
// 2. RequestBuilder 초기화
|
|
61
|
+
// createRequestBuilder를 통해 내부적으로 사용할 HTTP 요청 처리기를 만듭니다.
|
|
62
|
+
// 여기서 accessToken을 '함수' 형태로 넘기는 이유는,
|
|
63
|
+
// 나중에 setAccessToken()으로 값이 바뀌었을 때, RequestBuilder가 최신 값을 참조할 수 있게 하기 위함입니다.
|
|
44
64
|
this.rb = createRequestBuilder({
|
|
45
65
|
baseUrl: GRAPHNODE_BASE_URL,
|
|
46
66
|
...opts,
|
|
47
|
-
fetch: fetchFn, //
|
|
48
|
-
accessToken: () => this._accessToken, // 동적 토큰
|
|
67
|
+
fetch: fetchFn, // 결정된 fetch 함수 주입
|
|
68
|
+
accessToken: () => this._accessToken, // [중요] 동적 토큰 참조를 위한 Getter 함수 전달
|
|
49
69
|
});
|
|
70
|
+
// 3. 각 API 모듈 초기화
|
|
71
|
+
// 각 모듈은 공유된 RequestBuilder(this.rb)를 사용하여 통신합니다.
|
|
50
72
|
this.health = new HealthApi(this.rb);
|
|
51
73
|
this.me = new MeApi(this.rb);
|
|
52
74
|
this.conversations = new ConversationsApi(this.rb);
|
|
@@ -57,10 +79,14 @@ export class GraphNodeClient {
|
|
|
57
79
|
this.appleAuth = new AppleAuthApi(GRAPHNODE_BASE_URL);
|
|
58
80
|
this.sync = new SyncApi(this.rb);
|
|
59
81
|
this.ai = new AiApi(this.rb);
|
|
82
|
+
this.notification = new NotificationApi(this.rb);
|
|
60
83
|
}
|
|
61
84
|
/**
|
|
62
|
-
* Access Token을 설정합니다.
|
|
63
|
-
*
|
|
85
|
+
* Access Token을 동적으로 설정합니다.
|
|
86
|
+
* - 로그인 후 발급받은 토큰을 수동으로 설정하거나, 로그아웃 시 null로 초기화할 때 사용합니다.
|
|
87
|
+
* - 쿠키 기반 인증을 사용하는 경우, 이 함수를 호출하지 않아도(null 상태여도) 정상 동작합니다.
|
|
88
|
+
*
|
|
89
|
+
* @param token JWT Access Token 문자열 또는 null (초기화)
|
|
64
90
|
*/
|
|
65
91
|
setAccessToken(token) {
|
|
66
92
|
this._accessToken = token;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAuB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../src/endpoints/notification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAiB;gBAExB,EAAE,EAAE,cAAc;IAI9B
|
|
1
|
+
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../src/endpoints/notification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAiB;gBAExB,EAAE,EAAE,cAAc;IAI9B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,YAAY,IAAI,MAAM;IAItB;;;;OAIG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;;;OAIG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAItD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/endpoints/notification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,eAAe;IAG1B,YAAY,EAAkB;QAC5B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/endpoints/notification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,eAAe;IAG1B,YAAY,EAAkB;QAC5B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,mBAAmB,CAAC,KAAa;QACrC,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CAAC,KAAa;QACnC,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;CAEF"}
|
package/dist/http-builder.d.ts
CHANGED
|
@@ -26,13 +26,50 @@ export type HttpResponseError = {
|
|
|
26
26
|
};
|
|
27
27
|
export type HttpResponse<T> = HttpResponseSuccess<T> | HttpResponseError;
|
|
28
28
|
export declare class RequestBuilder {
|
|
29
|
+
/**
|
|
30
|
+
* API 기본 URL (마지막 슬래시 제거됨)
|
|
31
|
+
* @private
|
|
32
|
+
*/
|
|
29
33
|
private readonly baseUrl;
|
|
34
|
+
/**
|
|
35
|
+
* 실제 HTTP 요청을 수행할 fetch 함수 구현체
|
|
36
|
+
* @private
|
|
37
|
+
*/
|
|
30
38
|
private readonly fetchImpl;
|
|
39
|
+
/**
|
|
40
|
+
* 모든 요청에 포함될 기본 HTTP 헤더 (예: Accept: application/json)
|
|
41
|
+
* @private
|
|
42
|
+
*/
|
|
31
43
|
private readonly headers;
|
|
44
|
+
/**
|
|
45
|
+
* 자격 증명(쿠키) 전송 모드 ('include' | 'omit' | 'same-origin')
|
|
46
|
+
* - 'include'로 설정 시 브라우저가 자동으로 쿠키를 전송합니다.
|
|
47
|
+
* @private
|
|
48
|
+
*/
|
|
32
49
|
private readonly credentials;
|
|
50
|
+
/**
|
|
51
|
+
* Access Token을 동적으로 반환하는 함수 또는 정적 문자열.
|
|
52
|
+
* - 함수로 설정된 경우 요청 시점의 최신 토큰을 조회하여 Authorization 헤더에 사용합니다.
|
|
53
|
+
* - 값이 없으면(undefined) Authorization 헤더를 추가하지 않습니다 (쿠키 인증 의존).
|
|
54
|
+
* @private
|
|
55
|
+
*/
|
|
33
56
|
private readonly accessToken?;
|
|
57
|
+
/**
|
|
58
|
+
* 현재 빌더가 가지고 있는 URL 경로 조각들
|
|
59
|
+
* @private
|
|
60
|
+
*/
|
|
34
61
|
private readonly segments;
|
|
62
|
+
/**
|
|
63
|
+
* 현재 빌더가 가지고 있는 쿼리 파라미터들
|
|
64
|
+
* @private
|
|
65
|
+
*/
|
|
35
66
|
private readonly queryParams;
|
|
67
|
+
/**
|
|
68
|
+
* RequestBuilder 생성자
|
|
69
|
+
* @param opts 빌더 공통 옵션 (baseUrl, fetch, headers 등)
|
|
70
|
+
* @param segments 초기 URL 경로 조각 리스트
|
|
71
|
+
* @param query 초기 쿼리 파라미터
|
|
72
|
+
*/
|
|
36
73
|
constructor(opts: BuilderOptions, segments?: string[], query?: URLSearchParams);
|
|
37
74
|
/**
|
|
38
75
|
* 경로 조각을 추가한다. '/v1/me' 같은 절대 경로도 허용한다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-builder.d.ts","sourceRoot":"","sources":["../src/http-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE5F,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC;CAC9C;AAaD,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;AAEzE,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"http-builder.d.ts","sourceRoot":"","sources":["../src/http-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE5F,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC;CAC9C;AAaD,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;AAEzE,qBAAa,cAAc;IACzB;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IAEjD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAEjD;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAiC;IAE9D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAE9C;;;;;OAKG;gBACS,IAAI,EAAE,cAAc,EAAE,QAAQ,GAAE,MAAM,EAAO,EAAE,KAAK,CAAC,EAAE,eAAe;IAUlF;;;OAGG;IACH,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,cAAc;IA6B/B;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc;IAmBjD,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIlC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIjD,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIlD,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIlD,GAAG,IAAI,MAAM;IAMP,OAAO,CAClB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO,EACd,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,QAAQ,CAAC;YAiDN,IAAI;CA6CnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAEzE"}
|
package/dist/http-builder.js
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* - 기본적으로 credentials: 'include' 로 세션 쿠키를 전송한다.
|
|
5
5
|
*/
|
|
6
6
|
export class RequestBuilder {
|
|
7
|
+
/**
|
|
8
|
+
* RequestBuilder 생성자
|
|
9
|
+
* @param opts 빌더 공통 옵션 (baseUrl, fetch, headers 등)
|
|
10
|
+
* @param segments 초기 URL 경로 조각 리스트
|
|
11
|
+
* @param query 초기 쿼리 파라미터
|
|
12
|
+
*/
|
|
7
13
|
constructor(opts, segments = [], query) {
|
|
8
14
|
this.baseUrl = opts.baseUrl.replace(/\/$/, '');
|
|
9
15
|
this.fetchImpl = opts.fetch ?? globalThis.fetch;
|
package/dist/http-builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-builder.js","sourceRoot":"","sources":["../src/http-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwCH,MAAM,OAAO,cAAc;
|
|
1
|
+
{"version":3,"file":"http-builder.js","sourceRoot":"","sources":["../src/http-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwCH,MAAM,OAAO,cAAc;IA8CzB;;;;;OAKG;IACH,YAAY,IAAoB,EAAE,WAAqB,EAAE,EAAE,KAAuB;QAChF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,IAAK,UAAU,CAAC,KAAmB,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,KAAK,IAAI,IAAI,eAAe,EAAE,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,CAAS;QACZ,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,oDAAoD;YACpD,OAAO,IAAI,cAAc,CACvB;gBACE,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,IAAI,CAAC,SAAS;gBACrB,cAAc,EAAE,IAAI,CAAC,OAAO;gBAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,EACD,EAAE,EACF,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CACtC,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,cAAc,CACvB;YACE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,cAAc,EAAE,IAAI,CAAC,OAAO;YAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,EACD,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,EAC3B,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CACtC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAgC;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;gBAAE,SAAS;YAC5C,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,cAAc,CACvB;YACE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,cAAc,EAAE,IAAI,CAAC,OAAO;YAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,EACD,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAClB,CAAC,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG;QACP,OAAO,IAAI,CAAC,IAAI,CAAI,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,IAAc;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAI,MAAM,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAK,CAAI,IAAc;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAI,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAI,IAAc;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAI,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAEM,GAAG;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,OAAO,CAClB,MAAc,EACd,IAAc,EACd,YAAqC;QAErC,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,YAAY,EAA4B,CAAC;QAE/E,kBAAkB;QAClB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;YAC7F,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,IAAI,YAAY,QAAQ,EAAE,CAAC;gBAChE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;gBAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACjE,IAAI,GAAG,GAAG,MAAM,WAAW,EAAE,CAAC;QAE9B,8CAA8C;QAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,gEAAgE;gBAChE,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,OAAO,eAAe,CAAC;gBAClD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;oBAClD,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,WAAW,EAAE,SAAS,EAAE,WAAW;iBACpC,CAAC,CAAC;gBAEH,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;oBAClB,qBAAqB;oBACrB,yDAAyD;oBACzD,GAAG,GAAG,MAAM,WAAW,EAAE,CAAC;gBAC5B,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,2CAA2C;gBAC3C,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,IAAI,CAAI,MAAc,EAAE,IAAc;QAClD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;YAE1F,MAAM,WAAW,GACf,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,GAAG,CAAC;YAExF,IAAI,OAAO,GAAY,SAAS,CAAC;YAEjC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO;oBACL,SAAS,EAAE,KAAK;oBAChB,KAAK,EAAE;wBACL,UAAU,EAAE,GAAG,CAAC,MAAM;wBACtB,OAAO,EAAE,QAAQ,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE;wBAChD,IAAI,EAAE,OAAO;qBACd;iBACF,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE,GAAG,CAAC,MAAM;gBACtB,IAAI,EAAE,OAAY;aACnB,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAU,CAAC;YACvB,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE;oBACL,UAAU,EAAE,CAAC;oBACb,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAoB;IACvD,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { NoteApi } from './endpoints/note.js';
|
|
|
10
10
|
import { AppleAuthApi } from './endpoints/auth.apple.js';
|
|
11
11
|
import { SyncApi } from './endpoints/sync.js';
|
|
12
12
|
import { AiApi } from './endpoints/ai.js';
|
|
13
|
+
import { NotificationApi } from './endpoints/notification.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* GraphNode 클라이언트 옵션
|
|
@@ -48,32 +49,62 @@ export class GraphNodeClient {
|
|
|
48
49
|
readonly appleAuth: AppleAuthApi;
|
|
49
50
|
readonly sync: SyncApi;
|
|
50
51
|
readonly ai: AiApi;
|
|
52
|
+
readonly notification: NotificationApi;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* HTTP 요청 빌더 인스턴스.
|
|
56
|
+
* 모든 API 엔드포인트가 이 빌더를 공유하여 HTTP 요청을 수행합니다.
|
|
57
|
+
* @private
|
|
58
|
+
*/
|
|
51
59
|
private readonly rb: RequestBuilder;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 현재 설정된 Access Token (Bearer 토큰).
|
|
63
|
+
* 쿠키 인증 방식을 사용할 경우 null일 수 있습니다.
|
|
64
|
+
* @private
|
|
65
|
+
*/
|
|
52
66
|
private _accessToken: string | null = null;
|
|
53
67
|
|
|
68
|
+
/**
|
|
69
|
+
* GraphNodeClient 생성자.
|
|
70
|
+
* - 실행 환경(브라우저/Node.js)에 맞는 fetch 함수를 자동으로 감지하여 설정합니다.
|
|
71
|
+
* - 기본 API URL 및 공통 헤더 등 통신 옵션을 초기화합니다.
|
|
72
|
+
*
|
|
73
|
+
* @param opts 클라이언트 설정 옵션
|
|
74
|
+
*/
|
|
54
75
|
constructor(opts: GraphNodeClientOptions = {}) {
|
|
76
|
+
// 1. fetch 함수 결정 전략
|
|
77
|
+
// 사용자가 opts.fetch로 직접 주입하지 않은 경우, 환경에 따라 적절한 기본 fetch를 찾습니다.
|
|
55
78
|
let fetchFn = opts.fetch;
|
|
56
79
|
|
|
57
80
|
if (!fetchFn) {
|
|
58
81
|
if (typeof window !== 'undefined' && window.fetch) {
|
|
59
|
-
//
|
|
60
|
-
// window.fetch
|
|
82
|
+
// [Browser / Electron Renderer 환경]
|
|
83
|
+
// window.fetch는 호출 시 'this'가 window여야 하므로 bind(window)가 필수입니다.
|
|
84
|
+
// 그냥 할당하면 "Illegal invocation" 에러가 발생할 수 있습니다.
|
|
61
85
|
fetchFn = window.fetch.bind(window);
|
|
62
86
|
} else if (typeof globalThis !== 'undefined' && (globalThis as any).fetch) {
|
|
63
|
-
//
|
|
87
|
+
// [Node.js 18+ / Bun / Deno 등 환경]
|
|
88
|
+
// 전역 스코프(globalThis)에 있는 fetch를 사용합니다.
|
|
64
89
|
fetchFn = (globalThis as any).fetch.bind(globalThis);
|
|
65
90
|
}
|
|
66
91
|
}
|
|
67
92
|
|
|
68
93
|
this._accessToken = opts.accessToken ?? null;
|
|
69
94
|
|
|
70
|
-
//
|
|
95
|
+
// 2. RequestBuilder 초기화
|
|
96
|
+
// createRequestBuilder를 통해 내부적으로 사용할 HTTP 요청 처리기를 만듭니다.
|
|
97
|
+
// 여기서 accessToken을 '함수' 형태로 넘기는 이유는,
|
|
98
|
+
// 나중에 setAccessToken()으로 값이 바뀌었을 때, RequestBuilder가 최신 값을 참조할 수 있게 하기 위함입니다.
|
|
71
99
|
this.rb = createRequestBuilder({
|
|
72
100
|
baseUrl: GRAPHNODE_BASE_URL,
|
|
73
101
|
...opts,
|
|
74
|
-
fetch: fetchFn, //
|
|
75
|
-
accessToken: () => this._accessToken, // 동적 토큰
|
|
102
|
+
fetch: fetchFn, // 결정된 fetch 함수 주입
|
|
103
|
+
accessToken: () => this._accessToken, // [중요] 동적 토큰 참조를 위한 Getter 함수 전달
|
|
76
104
|
});
|
|
105
|
+
|
|
106
|
+
// 3. 각 API 모듈 초기화
|
|
107
|
+
// 각 모듈은 공유된 RequestBuilder(this.rb)를 사용하여 통신합니다.
|
|
77
108
|
this.health = new HealthApi(this.rb);
|
|
78
109
|
this.me = new MeApi(this.rb);
|
|
79
110
|
this.conversations = new ConversationsApi(this.rb);
|
|
@@ -84,11 +115,15 @@ export class GraphNodeClient {
|
|
|
84
115
|
this.appleAuth = new AppleAuthApi(GRAPHNODE_BASE_URL);
|
|
85
116
|
this.sync = new SyncApi(this.rb);
|
|
86
117
|
this.ai = new AiApi(this.rb);
|
|
118
|
+
this.notification = new NotificationApi(this.rb);
|
|
87
119
|
}
|
|
88
120
|
|
|
89
121
|
/**
|
|
90
|
-
* Access Token을 설정합니다.
|
|
91
|
-
*
|
|
122
|
+
* Access Token을 동적으로 설정합니다.
|
|
123
|
+
* - 로그인 후 발급받은 토큰을 수동으로 설정하거나, 로그아웃 시 null로 초기화할 때 사용합니다.
|
|
124
|
+
* - 쿠키 기반 인증을 사용하는 경우, 이 함수를 호출하지 않아도(null 상태여도) 정상 동작합니다.
|
|
125
|
+
*
|
|
126
|
+
* @param token JWT Access Token 문자열 또는 null (초기화)
|
|
92
127
|
*/
|
|
93
128
|
setAccessToken(token: string | null) {
|
|
94
129
|
this._accessToken = token;
|
package/src/http-builder.ts
CHANGED
|
@@ -43,14 +43,57 @@ export type HttpResponseError = {
|
|
|
43
43
|
export type HttpResponse<T> = HttpResponseSuccess<T> | HttpResponseError;
|
|
44
44
|
|
|
45
45
|
export class RequestBuilder {
|
|
46
|
+
/**
|
|
47
|
+
* API 기본 URL (마지막 슬래시 제거됨)
|
|
48
|
+
* @private
|
|
49
|
+
*/
|
|
46
50
|
private readonly baseUrl: string;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 실제 HTTP 요청을 수행할 fetch 함수 구현체
|
|
54
|
+
* @private
|
|
55
|
+
*/
|
|
47
56
|
private readonly fetchImpl: FetchLike;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 모든 요청에 포함될 기본 HTTP 헤더 (예: Accept: application/json)
|
|
60
|
+
* @private
|
|
61
|
+
*/
|
|
48
62
|
private readonly headers: Record<string, string>;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 자격 증명(쿠키) 전송 모드 ('include' | 'omit' | 'same-origin')
|
|
66
|
+
* - 'include'로 설정 시 브라우저가 자동으로 쿠키를 전송합니다.
|
|
67
|
+
* @private
|
|
68
|
+
*/
|
|
49
69
|
private readonly credentials: RequestCredentials;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Access Token을 동적으로 반환하는 함수 또는 정적 문자열.
|
|
73
|
+
* - 함수로 설정된 경우 요청 시점의 최신 토큰을 조회하여 Authorization 헤더에 사용합니다.
|
|
74
|
+
* - 값이 없으면(undefined) Authorization 헤더를 추가하지 않습니다 (쿠키 인증 의존).
|
|
75
|
+
* @private
|
|
76
|
+
*/
|
|
50
77
|
private readonly accessToken?: string | (() => string | null);
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* 현재 빌더가 가지고 있는 URL 경로 조각들
|
|
81
|
+
* @private
|
|
82
|
+
*/
|
|
51
83
|
private readonly segments: string[];
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* 현재 빌더가 가지고 있는 쿼리 파라미터들
|
|
87
|
+
* @private
|
|
88
|
+
*/
|
|
52
89
|
private readonly queryParams: URLSearchParams;
|
|
53
90
|
|
|
91
|
+
/**
|
|
92
|
+
* RequestBuilder 생성자
|
|
93
|
+
* @param opts 빌더 공통 옵션 (baseUrl, fetch, headers 등)
|
|
94
|
+
* @param segments 초기 URL 경로 조각 리스트
|
|
95
|
+
* @param query 초기 쿼리 파라미터
|
|
96
|
+
*/
|
|
54
97
|
constructor(opts: BuilderOptions, segments: string[] = [], query?: URLSearchParams) {
|
|
55
98
|
this.baseUrl = opts.baseUrl.replace(/\/$/, '');
|
|
56
99
|
this.fetchImpl = opts.fetch ?? (globalThis.fetch as FetchLike);
|