@channel.io/app-sdk-server 0.7.3 → 0.8.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/dist/__tests__/native-client.test.js +55 -1
- package/dist/__tests__/native-client.test.js.map +1 -1
- package/dist/__tests__/proxy-api.test.js +39 -3
- package/dist/__tests__/proxy-api.test.js.map +1 -1
- package/dist/__tests__/token-manager.test.js +330 -552
- package/dist/__tests__/token-manager.test.js.map +1 -1
- package/dist/appstore/client.d.ts +3 -0
- package/dist/appstore/client.d.ts.map +1 -1
- package/dist/appstore/client.js +3 -0
- package/dist/appstore/client.js.map +1 -1
- package/dist/native/client.d.ts +3 -1
- package/dist/native/client.d.ts.map +1 -1
- package/dist/native/client.js +0 -19
- package/dist/native/client.js.map +1 -1
- package/dist/native/proxy-api.d.ts +13 -1
- package/dist/native/proxy-api.d.ts.map +1 -1
- package/dist/native/proxy-api.js +18 -0
- package/dist/native/proxy-api.js.map +1 -1
- package/dist/native/proxy-api.types.d.ts +1 -231
- package/dist/native/proxy-api.types.d.ts.map +1 -1
- package/dist/native/proxy-api.types.js +0 -8
- package/dist/native/proxy-api.types.js.map +1 -1
- package/dist/nestjs/channel-app.module.d.ts.map +1 -1
- package/dist/nestjs/channel-app.module.js +51 -6
- package/dist/nestjs/channel-app.module.js.map +1 -1
- package/dist/nestjs/channel-app.service.d.ts +6 -14
- package/dist/nestjs/channel-app.service.d.ts.map +1 -1
- package/dist/nestjs/channel-app.service.js +52 -50
- package/dist/nestjs/channel-app.service.js.map +1 -1
- package/dist/nestjs/channel-app.service.test.js +121 -23
- package/dist/nestjs/channel-app.service.test.js.map +1 -1
- package/dist/nestjs/types.d.ts +10 -0
- package/dist/nestjs/types.d.ts.map +1 -1
- package/dist/nestjs/types.js.map +1 -1
- package/dist/simple/channel-app.d.ts +3 -0
- package/dist/simple/channel-app.d.ts.map +1 -1
- package/dist/simple/channel-app.js +11 -4
- package/dist/simple/channel-app.js.map +1 -1
- package/dist/simple/index.d.ts.map +1 -1
- package/dist/simple/index.js +1 -0
- package/dist/simple/index.js.map +1 -1
- package/dist/token/cache.js +3 -3
- package/dist/token/cache.js.map +1 -1
- package/dist/token/manager.d.ts +20 -114
- package/dist/token/manager.d.ts.map +1 -1
- package/dist/token/manager.js +151 -202
- package/dist/token/manager.js.map +1 -1
- package/dist/token/types.d.ts +13 -25
- package/dist/token/types.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/token/manager.js
CHANGED
|
@@ -1,174 +1,122 @@
|
|
|
1
1
|
import { InMemoryTokenCache } from "./cache.js";
|
|
2
|
-
/**
|
|
3
|
-
* Default refresh buffer: 5 minutes before expiry
|
|
4
|
-
*/
|
|
5
2
|
const DEFAULT_REFRESH_BUFFER_MS = 5 * 60 * 1000;
|
|
3
|
+
const DEFAULT_APPSTORE_URL = "https://app-store.channel.io";
|
|
4
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 10_000;
|
|
5
|
+
const MAX_TOKEN_INVALIDATION_RETRIES = 2;
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*/
|
|
9
|
-
const DEFAULT_API_BASE_URL = "https://api.channel.io";
|
|
10
|
-
/**
|
|
11
|
-
* Token manager for Channel.io App SDK
|
|
12
|
-
*
|
|
13
|
-
* Handles token issuance, caching, and automatic refresh for:
|
|
14
|
-
* - Manager tokens (for desk/agent operations)
|
|
15
|
-
* - User tokens (for user-facing operations)
|
|
16
|
-
* - Channel tokens (for channel-level operations)
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```typescript
|
|
20
|
-
* import { TokenManager } from '@channel.io/app-sdk-server';
|
|
7
|
+
* Token manager for AppStore native function tokens.
|
|
21
8
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* // Get a manager token (with automatic caching and refresh)
|
|
28
|
-
* const token = await tokenManager.getManagerToken({
|
|
29
|
-
* channelId: 'channel-123',
|
|
30
|
-
* managerId: 'manager-456',
|
|
31
|
-
* });
|
|
32
|
-
*
|
|
33
|
-
* // Use the token for API calls
|
|
34
|
-
* await fetch('https://api.channel.io/...', {
|
|
35
|
-
* headers: {
|
|
36
|
-
* 'Authorization': `Bearer ${token.accessToken}`,
|
|
37
|
-
* },
|
|
38
|
-
* });
|
|
39
|
-
* ```
|
|
9
|
+
* Handles app/channel token issuance, caching, automatic refresh, and
|
|
10
|
+
* concurrent request deduplication. Token exchange is performed through
|
|
11
|
+
* AppStore native `issueToken` / `refreshToken` using `PUT
|
|
12
|
+
* /general/v1/native/functions`.
|
|
40
13
|
*/
|
|
41
14
|
export class TokenManager {
|
|
42
|
-
|
|
15
|
+
appId;
|
|
16
|
+
appSecret;
|
|
17
|
+
appStoreUrl;
|
|
18
|
+
refreshBufferMs;
|
|
43
19
|
cache;
|
|
44
20
|
debug;
|
|
45
|
-
|
|
46
|
-
* In-flight promise map to prevent thundering herd.
|
|
47
|
-
* When multiple callers request the same token concurrently,
|
|
48
|
-
* only one actual API call is made and the result is shared.
|
|
49
|
-
*/
|
|
21
|
+
logger;
|
|
50
22
|
inFlight = new Map();
|
|
51
|
-
/**
|
|
52
|
-
* Generation counter to prevent stale in-flight promises from overwriting
|
|
53
|
-
* cache after invalidateToken() or clearCache() is called.
|
|
54
|
-
*/
|
|
55
23
|
cacheGeneration = 0;
|
|
56
24
|
constructor(config) {
|
|
57
|
-
this.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
};
|
|
25
|
+
this.appId = config.appId;
|
|
26
|
+
this.appSecret = config.appSecret;
|
|
27
|
+
this.appStoreUrl = config.appStoreUrl ?? DEFAULT_APPSTORE_URL;
|
|
28
|
+
this.refreshBufferMs = config.refreshBufferMs ?? DEFAULT_REFRESH_BUFFER_MS;
|
|
62
29
|
this.cache = config.cacheStorage ?? new InMemoryTokenCache();
|
|
63
30
|
this.debug = config.debug ?? false;
|
|
31
|
+
this.logger = config.logger;
|
|
64
32
|
}
|
|
65
|
-
/**
|
|
66
|
-
* Get a manager token with automatic caching and refresh
|
|
67
|
-
*/
|
|
68
|
-
async getManagerToken(request) {
|
|
69
|
-
const cacheKey = this.buildCacheKey("manager", request.channelId, request.managerId);
|
|
70
|
-
return this.getOrRefreshToken(cacheKey, () => this.issueManagerToken(request));
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Get a user token with automatic caching and refresh
|
|
74
|
-
*/
|
|
75
|
-
async getUserToken(request) {
|
|
76
|
-
const cacheKey = this.buildCacheKey("user", request.channelId, request.userId);
|
|
77
|
-
return this.getOrRefreshToken(cacheKey, () => this.issueUserToken(request));
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Get a channel token with automatic caching and refresh
|
|
81
|
-
*/
|
|
82
33
|
async getChannelToken(request) {
|
|
83
34
|
const cacheKey = this.buildCacheKey("channel", request.channelId);
|
|
84
35
|
return this.getOrRefreshToken(cacheKey, () => this.issueChannelToken(request));
|
|
85
36
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Get an app-level token with automatic caching and refresh.
|
|
88
|
-
*
|
|
89
|
-
* App tokens are not scoped to a channel and are used for app-level
|
|
90
|
-
* operations such as `registerExtension` and
|
|
91
|
-
* `registerAlfTasks`.
|
|
92
|
-
*/
|
|
93
37
|
async getAppToken() {
|
|
94
38
|
const cacheKey = this.buildCacheKey("app");
|
|
95
39
|
return this.getOrRefreshToken(cacheKey, () => this.issueAppToken());
|
|
96
40
|
}
|
|
97
|
-
/**
|
|
98
|
-
* Manually refresh a token (bypass cache)
|
|
99
|
-
*/
|
|
100
41
|
async refreshToken(refreshToken) {
|
|
101
|
-
const response = await this.
|
|
102
|
-
|
|
103
|
-
body: JSON.stringify({ refreshToken }),
|
|
42
|
+
const response = await this.nativeFunctionRequest("refreshToken", {
|
|
43
|
+
refreshToken,
|
|
104
44
|
});
|
|
105
45
|
return this.normalizeTokenResponse(response);
|
|
106
46
|
}
|
|
107
|
-
async
|
|
108
|
-
|
|
47
|
+
async invalidateAppToken() {
|
|
48
|
+
await this.invalidateCacheKey(this.buildCacheKey("app"));
|
|
49
|
+
}
|
|
50
|
+
async invalidateChannelToken(channelId) {
|
|
51
|
+
await this.invalidateCacheKey(this.buildCacheKey("channel", channelId));
|
|
52
|
+
}
|
|
53
|
+
async invalidateCacheKey(cacheKey) {
|
|
109
54
|
this.cacheGeneration++;
|
|
110
55
|
this.inFlight.delete(cacheKey);
|
|
111
56
|
await this.cache.delete(cacheKey);
|
|
112
57
|
}
|
|
113
|
-
/**
|
|
114
|
-
* Clear all cached tokens
|
|
115
|
-
*/
|
|
116
58
|
async clearCache() {
|
|
117
59
|
this.cacheGeneration++;
|
|
118
60
|
this.inFlight.clear();
|
|
119
61
|
await this.cache.clear();
|
|
120
62
|
}
|
|
121
|
-
/**
|
|
122
|
-
* Get or refresh a token with automatic caching and thundering herd prevention.
|
|
123
|
-
*
|
|
124
|
-
* When multiple concurrent callers request the same token, only one API call
|
|
125
|
-
* is made. Subsequent callers await the same in-flight promise.
|
|
126
|
-
*/
|
|
127
63
|
async getOrRefreshToken(cacheKey, issueToken) {
|
|
128
|
-
// Try to get from cache
|
|
129
64
|
const cached = await this.cache.get(cacheKey);
|
|
130
|
-
if (cached) {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
65
|
+
if (cached && !this.needsRefresh(cached)) {
|
|
66
|
+
this.log(`Cache hit for ${cacheKey}`);
|
|
67
|
+
return cached.token;
|
|
68
|
+
}
|
|
69
|
+
return this.dedup(cacheKey, () => this.getOrRefreshTokenWithRetry(cacheKey, issueToken));
|
|
70
|
+
}
|
|
71
|
+
async getOrRefreshTokenWithRetry(cacheKey, issueToken) {
|
|
72
|
+
for (let attempt = 0; attempt <= MAX_TOKEN_INVALIDATION_RETRIES; attempt++) {
|
|
73
|
+
const token = await this.getOrRefreshTokenOnce(cacheKey, issueToken);
|
|
74
|
+
if (token) {
|
|
75
|
+
return token;
|
|
138
76
|
}
|
|
139
|
-
|
|
77
|
+
if (attempt < MAX_TOKEN_INVALIDATION_RETRIES) {
|
|
78
|
+
this.log(`Token invalidated while resolving ${cacheKey}; retrying ` +
|
|
79
|
+
`(${attempt + 1}/${MAX_TOKEN_INVALIDATION_RETRIES})`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
throw new TokenManagerError(`Token invalidated while resolving ${cacheKey}; retry limit exceeded`);
|
|
83
|
+
}
|
|
84
|
+
async getOrRefreshTokenOnce(cacheKey, issueToken) {
|
|
85
|
+
const latest = await this.cache.get(cacheKey);
|
|
86
|
+
if (latest && !this.needsRefresh(latest)) {
|
|
87
|
+
this.log(`Cache hit for ${cacheKey}`);
|
|
88
|
+
return latest.token;
|
|
89
|
+
}
|
|
90
|
+
const generation = this.cacheGeneration;
|
|
91
|
+
if (latest) {
|
|
140
92
|
this.log(`Token expiring soon, refreshing for ${cacheKey}`);
|
|
141
|
-
const refreshGen = this.cacheGeneration;
|
|
142
93
|
try {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (this.cacheGeneration === refreshGen) {
|
|
146
|
-
await this.cacheToken(cacheKey, refreshed);
|
|
147
|
-
}
|
|
94
|
+
const refreshed = await this.refreshToken(latest.token.refreshToken);
|
|
95
|
+
if (await this.cacheTokenIfCurrent(cacheKey, refreshed, generation)) {
|
|
148
96
|
return refreshed;
|
|
149
|
-
}
|
|
97
|
+
}
|
|
98
|
+
this.log(`Token invalidated while refreshing for ${cacheKey}`);
|
|
99
|
+
return null;
|
|
150
100
|
}
|
|
151
101
|
catch (error) {
|
|
152
|
-
this.log(`Refresh failed, re-issuing token for ${cacheKey}`, error);
|
|
153
|
-
|
|
102
|
+
this.log(`Refresh failed, re-issuing token for ${cacheKey}`, this.sanitizeLogError(error));
|
|
103
|
+
if (this.cacheGeneration !== generation) {
|
|
104
|
+
this.log(`Token invalidated after refresh failure for ${cacheKey}`);
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
154
107
|
}
|
|
155
108
|
}
|
|
156
|
-
// Issue new token (with thundering herd prevention)
|
|
157
109
|
this.log(`Issuing new token for ${cacheKey}`);
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
const token = await issueToken();
|
|
161
|
-
// Only cache if no invalidation occurred while this request was in-flight
|
|
162
|
-
if (this.cacheGeneration === genBefore) {
|
|
163
|
-
await this.cacheToken(cacheKey, token);
|
|
164
|
-
}
|
|
110
|
+
const token = await issueToken();
|
|
111
|
+
if (await this.cacheTokenIfCurrent(cacheKey, token, generation)) {
|
|
165
112
|
return token;
|
|
166
|
-
}
|
|
113
|
+
}
|
|
114
|
+
this.log(`Token invalidated while issuing for ${cacheKey}`);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
needsRefresh(cached) {
|
|
118
|
+
return Date.now() >= cached.expiresAt - this.refreshBufferMs;
|
|
167
119
|
}
|
|
168
|
-
/**
|
|
169
|
-
* Deduplicate concurrent requests for the same cache key.
|
|
170
|
-
* If there's already an in-flight request, return its promise instead of starting a new one.
|
|
171
|
-
*/
|
|
172
120
|
async dedup(cacheKey, fn) {
|
|
173
121
|
const existing = this.inFlight.get(cacheKey);
|
|
174
122
|
if (existing) {
|
|
@@ -181,120 +129,121 @@ export class TokenManager {
|
|
|
181
129
|
this.inFlight.set(cacheKey, promise);
|
|
182
130
|
return promise;
|
|
183
131
|
}
|
|
184
|
-
/**
|
|
185
|
-
* Issue a manager token
|
|
186
|
-
*/
|
|
187
|
-
async issueManagerToken(request) {
|
|
188
|
-
const response = await this.apiRequest(`/app/v1/channels/${request.channelId}/managers/${request.managerId}/token`, { method: "POST" });
|
|
189
|
-
return this.normalizeTokenResponse(response);
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Issue a user token
|
|
193
|
-
*/
|
|
194
|
-
async issueUserToken(request) {
|
|
195
|
-
const response = await this.apiRequest(`/app/v1/channels/${request.channelId}/users/${request.userId}/token`, { method: "POST" });
|
|
196
|
-
return this.normalizeTokenResponse(response);
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Issue a channel token
|
|
200
|
-
*/
|
|
201
132
|
async issueChannelToken(request) {
|
|
202
|
-
const response = await this.
|
|
133
|
+
const response = await this.nativeFunctionRequest("issueToken", {
|
|
134
|
+
secret: this.appSecret,
|
|
135
|
+
channelId: request.channelId,
|
|
136
|
+
});
|
|
203
137
|
return this.normalizeTokenResponse(response);
|
|
204
138
|
}
|
|
205
|
-
/**
|
|
206
|
-
* Issue an app-level token (no channelId required)
|
|
207
|
-
*/
|
|
208
139
|
async issueAppToken() {
|
|
209
|
-
const response = await this.
|
|
140
|
+
const response = await this.nativeFunctionRequest("issueToken", {
|
|
141
|
+
secret: this.appSecret,
|
|
142
|
+
});
|
|
210
143
|
return this.normalizeTokenResponse(response);
|
|
211
144
|
}
|
|
212
|
-
/**
|
|
213
|
-
* Cache a token
|
|
214
|
-
*/
|
|
215
145
|
async cacheToken(key, token) {
|
|
146
|
+
const expiresAt = Date.now() + token.expiresIn * 1000;
|
|
216
147
|
const cached = {
|
|
217
148
|
token,
|
|
218
149
|
cachedAt: Date.now(),
|
|
150
|
+
expiresAt,
|
|
219
151
|
key,
|
|
220
152
|
};
|
|
221
|
-
|
|
222
|
-
const ttlMs = token.expiresAt - Date.now();
|
|
153
|
+
const ttlMs = expiresAt - Date.now();
|
|
223
154
|
await this.cache.set(key, cached, ttlMs > 0 ? ttlMs : undefined);
|
|
224
155
|
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
156
|
+
async cacheTokenIfCurrent(key, token, generation) {
|
|
157
|
+
if (this.cacheGeneration !== generation) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
await this.cacheToken(key, token);
|
|
161
|
+
return this.cacheGeneration === generation;
|
|
162
|
+
}
|
|
163
|
+
buildCacheKey(type, channelId) {
|
|
164
|
+
const parts = [this.appId, type];
|
|
230
165
|
if (channelId)
|
|
231
166
|
parts.push(channelId);
|
|
232
|
-
if (entityId)
|
|
233
|
-
parts.push(entityId);
|
|
234
167
|
return parts.join(":");
|
|
235
168
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
}
|
|
169
|
+
async nativeFunctionRequest(method, params) {
|
|
170
|
+
const url = `${this.appStoreUrl}/general/v1/native/functions`;
|
|
171
|
+
const controller = new AbortController();
|
|
172
|
+
const timeout = setTimeout(() => controller.abort(), DEFAULT_REQUEST_TIMEOUT_MS);
|
|
173
|
+
let response;
|
|
174
|
+
try {
|
|
175
|
+
response = await fetch(url, {
|
|
176
|
+
method: "PUT",
|
|
177
|
+
headers: {
|
|
178
|
+
"Content-Type": "application/json",
|
|
179
|
+
},
|
|
180
|
+
body: JSON.stringify({ method, params }),
|
|
181
|
+
signal: controller.signal,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
clearTimeout(timeout);
|
|
186
|
+
}
|
|
251
187
|
if (!response.ok) {
|
|
252
188
|
const errorBody = await response.text();
|
|
253
|
-
throw new TokenManagerError(`
|
|
189
|
+
throw new TokenManagerError(`Native function token request failed: ${String(response.status)} ${response.statusText}`, response.status, errorBody);
|
|
254
190
|
}
|
|
255
|
-
|
|
191
|
+
const body = (await response.json());
|
|
192
|
+
if (body.error) {
|
|
193
|
+
throw new TokenManagerError(body.error.message, body.error.code, JSON.stringify(body.error.data));
|
|
194
|
+
}
|
|
195
|
+
return body.result;
|
|
256
196
|
}
|
|
257
|
-
/**
|
|
258
|
-
* Normalize token response (handle different API response formats)
|
|
259
|
-
*/
|
|
260
197
|
normalizeTokenResponse(response) {
|
|
261
|
-
|
|
262
|
-
|
|
198
|
+
if (!response ||
|
|
199
|
+
typeof response.accessToken !== "string" ||
|
|
200
|
+
response.accessToken.length === 0 ||
|
|
201
|
+
typeof response.refreshToken !== "string" ||
|
|
202
|
+
response.refreshToken.length === 0 ||
|
|
203
|
+
typeof response.expiresIn !== "number" ||
|
|
204
|
+
!Number.isFinite(response.expiresIn) ||
|
|
205
|
+
response.expiresIn <= 0) {
|
|
206
|
+
throw new TokenManagerError("Invalid native token response", undefined, JSON.stringify(response));
|
|
207
|
+
}
|
|
263
208
|
return {
|
|
264
|
-
accessToken: response.accessToken
|
|
265
|
-
refreshToken: response.refreshToken
|
|
266
|
-
expiresIn,
|
|
267
|
-
expiresAt: response.expiresAt ?? Date.now() + expiresIn * 1000,
|
|
268
|
-
refreshTokenExpiresAt: response.refreshTokenExpiresAt ?? Date.now() + refreshTokenExpiresIn * 1000,
|
|
269
|
-
tokenType: response.tokenType ?? response.token_type ?? "Bearer",
|
|
270
|
-
scopes: response.scopes ?? (response.scope ? response.scope.split(" ") : []),
|
|
209
|
+
accessToken: response.accessToken,
|
|
210
|
+
refreshToken: response.refreshToken,
|
|
211
|
+
expiresIn: response.expiresIn,
|
|
271
212
|
};
|
|
272
213
|
}
|
|
273
|
-
/**
|
|
274
|
-
* Debug logging
|
|
275
|
-
*/
|
|
276
214
|
log(message, error) {
|
|
277
|
-
if (this.debug) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
215
|
+
if (!this.debug || !this.logger) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (error) {
|
|
219
|
+
this.logger.debug(message, error);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
this.logger.debug(message);
|
|
284
223
|
}
|
|
285
224
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
225
|
+
sanitizeLogError(error) {
|
|
226
|
+
if (error instanceof TokenManagerError) {
|
|
227
|
+
return {
|
|
228
|
+
name: error.name,
|
|
229
|
+
message: error.message,
|
|
230
|
+
statusCode: error.statusCode,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
if (error instanceof Error) {
|
|
234
|
+
return {
|
|
235
|
+
name: error.name,
|
|
236
|
+
message: error.message,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
return { message: String(error) };
|
|
240
|
+
}
|
|
289
241
|
destroy() {
|
|
290
242
|
if (this.cache instanceof InMemoryTokenCache) {
|
|
291
243
|
this.cache.destroy();
|
|
292
244
|
}
|
|
293
245
|
}
|
|
294
246
|
}
|
|
295
|
-
/**
|
|
296
|
-
* Token manager error
|
|
297
|
-
*/
|
|
298
247
|
export class TokenManagerError extends Error {
|
|
299
248
|
statusCode;
|
|
300
249
|
responseBody;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/token/manager.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/token/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/token/types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Token types and interfaces for Channel.io App SDK
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
* Token response from
|
|
5
|
+
* Token response from AppStore native issueToken / refreshToken.
|
|
6
6
|
*/
|
|
7
7
|
export interface TokenResponse {
|
|
8
8
|
/** Access token for API calls */
|
|
@@ -11,14 +11,6 @@ export interface TokenResponse {
|
|
|
11
11
|
refreshToken: string;
|
|
12
12
|
/** Token expiration time in seconds */
|
|
13
13
|
expiresIn: number;
|
|
14
|
-
/** Token expiration timestamp (Unix milliseconds) */
|
|
15
|
-
expiresAt: number;
|
|
16
|
-
/** Refresh token expiration timestamp (Unix milliseconds) */
|
|
17
|
-
refreshTokenExpiresAt: number;
|
|
18
|
-
/** Token type (usually "Bearer") */
|
|
19
|
-
tokenType: string;
|
|
20
|
-
/** Granted scopes */
|
|
21
|
-
scopes: string[];
|
|
22
14
|
}
|
|
23
15
|
/**
|
|
24
16
|
* Cached token entry with metadata
|
|
@@ -28,6 +20,8 @@ export interface CachedToken {
|
|
|
28
20
|
token: TokenResponse;
|
|
29
21
|
/** When this cache entry was created */
|
|
30
22
|
cachedAt: number;
|
|
23
|
+
/** Access token expiration timestamp derived by the SDK (Unix milliseconds) */
|
|
24
|
+
expiresAt: number;
|
|
31
25
|
/** Cache key identifier */
|
|
32
26
|
key: string;
|
|
33
27
|
}
|
|
@@ -45,6 +39,12 @@ export interface TokenCacheStorage {
|
|
|
45
39
|
/** Clear all cached tokens */
|
|
46
40
|
clear(): Promise<void>;
|
|
47
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Logger interface accepted by TokenManager.
|
|
44
|
+
*/
|
|
45
|
+
export interface TokenManagerLogger {
|
|
46
|
+
debug(message: string, ...optionalParams: unknown[]): void;
|
|
47
|
+
}
|
|
48
48
|
/**
|
|
49
49
|
* Token manager configuration
|
|
50
50
|
*/
|
|
@@ -53,28 +53,16 @@ export interface TokenManagerConfig {
|
|
|
53
53
|
appId: string;
|
|
54
54
|
/** App secret */
|
|
55
55
|
appSecret: string;
|
|
56
|
-
/**
|
|
57
|
-
|
|
56
|
+
/** AppStore API base URL (default: https://app-store.channel.io) */
|
|
57
|
+
appStoreUrl?: string;
|
|
58
58
|
/** Custom cache storage (default: in-memory) */
|
|
59
59
|
cacheStorage?: TokenCacheStorage;
|
|
60
60
|
/** Buffer time before expiry to trigger refresh (default: 5 minutes) */
|
|
61
61
|
refreshBufferMs?: number;
|
|
62
62
|
/** Enable debug logging */
|
|
63
63
|
debug?: boolean;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
* Token request for issuing manager token
|
|
67
|
-
*/
|
|
68
|
-
export interface ManagerTokenRequest {
|
|
69
|
-
channelId: string;
|
|
70
|
-
managerId: string;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Token request for issuing user token
|
|
74
|
-
*/
|
|
75
|
-
export interface UserTokenRequest {
|
|
76
|
-
channelId: string;
|
|
77
|
-
userId: string;
|
|
64
|
+
/** Logger used when debug logging is enabled */
|
|
65
|
+
logger?: TokenManagerLogger;
|
|
78
66
|
}
|
|
79
67
|
/**
|
|
80
68
|
* Token request for issuing channel token
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/token/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/token/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,KAAK,EAAE,aAAa,CAAC;IACrB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC9C,yBAAyB;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,4BAA4B;IAC5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,8BAA8B;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC5D;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gDAAgD;IAChD,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@channel.io/app-sdk-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "NestJS server SDK for Channel.io apps",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"zod": "^3.24.1",
|
|
25
25
|
"zod-to-json-schema": "^3.24.1",
|
|
26
|
-
"@channel.io/app-sdk-core": "0.
|
|
26
|
+
"@channel.io/app-sdk-core": "0.8.0"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"@nestjs/common": ">=10.0.0",
|