@channel.io/app-sdk-server 0.3.0 → 0.4.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 +23 -21
- package/dist/__tests__/native-client.test.js.map +1 -1
- package/dist/__tests__/proxy-api.test.js +1 -4
- package/dist/__tests__/proxy-api.test.js.map +1 -1
- package/dist/__tests__/testing-utils.test.js.map +1 -1
- package/dist/decorators/extension-names.d.ts +1 -1
- package/dist/decorators/extension-names.d.ts.map +1 -1
- package/dist/decorators/extension-names.js +1 -0
- package/dist/decorators/extension-names.js.map +1 -1
- package/dist/native/client.d.ts +53 -32
- package/dist/native/client.d.ts.map +1 -1
- package/dist/native/client.js +69 -56
- package/dist/native/client.js.map +1 -1
- package/dist/native/types.d.ts +4 -29
- package/dist/native/types.d.ts.map +1 -1
- package/dist/nestjs/channel-app.service.d.ts +25 -5
- package/dist/nestjs/channel-app.service.d.ts.map +1 -1
- package/dist/nestjs/channel-app.service.js +68 -23
- package/dist/nestjs/channel-app.service.js.map +1 -1
- package/dist/nestjs/channel-app.service.test.js +156 -104
- package/dist/nestjs/channel-app.service.test.js.map +1 -1
- package/dist/nestjs/types.d.ts +3 -3
- package/dist/nestjs/types.d.ts.map +1 -1
- package/dist/nestjs/types.js.map +1 -1
- package/dist/testing/mock-context.d.ts +2 -2
- package/dist/testing/mock-context.d.ts.map +1 -1
- package/dist/testing/mock-context.js.map +1 -1
- package/package.json +2 -2
package/dist/native/client.js
CHANGED
|
@@ -4,121 +4,134 @@ import { ProxyApi } from "./proxy-api.js";
|
|
|
4
4
|
*/
|
|
5
5
|
const DEFAULT_APPSTORE_URL = "https://app-store.channel.io";
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* HTTP transport client for ch-app-store native functions.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* Stateless — holds no app credentials. Callers are responsible for
|
|
10
|
+
* supplying `appId`, `appSecret`, and `accessToken` at each call site,
|
|
11
|
+
* which keeps token lifecycle management (caching, refresh) in the caller layer.
|
|
12
|
+
*
|
|
13
|
+
* Most methods require a valid `accessToken` obtained via `issueToken()`.
|
|
14
|
+
* `issueToken` and `refreshToken` share the same rate limit (10 calls / 30 min),
|
|
15
|
+
* so callers should cache the token pair and prefer `refreshToken` on renewal.
|
|
11
16
|
*
|
|
12
17
|
* @example
|
|
13
18
|
* ```typescript
|
|
14
19
|
* import { NativeFunctionClient } from '@channel.io/app-sdk-server';
|
|
15
20
|
*
|
|
16
|
-
* const client = new NativeFunctionClient(
|
|
17
|
-
* appId: process.env.APP_ID,
|
|
18
|
-
* appSecret: process.env.APP_SECRET,
|
|
19
|
-
* });
|
|
21
|
+
* const client = new NativeFunctionClient();
|
|
20
22
|
*
|
|
21
|
-
* // Issue a token
|
|
22
|
-
* const
|
|
23
|
+
* // Issue a token (app-scoped)
|
|
24
|
+
* const { accessToken, refreshToken, expiresIn } = await client.issueToken(APP_SECRET);
|
|
23
25
|
*
|
|
24
26
|
* // Register commands
|
|
25
|
-
* await client.registerCommands([
|
|
27
|
+
* await client.registerCommands(APP_ID, [
|
|
26
28
|
* {
|
|
27
29
|
* name: 'hello',
|
|
28
30
|
* scope: 'desk',
|
|
29
31
|
* actionFunctionName: 'hello.action',
|
|
30
32
|
* alfMode: 'disable',
|
|
31
33
|
* },
|
|
32
|
-
* ]);
|
|
34
|
+
* ], accessToken);
|
|
33
35
|
* ```
|
|
34
36
|
*/
|
|
35
37
|
export class NativeFunctionClient {
|
|
36
|
-
|
|
38
|
+
appStoreUrl;
|
|
37
39
|
debug;
|
|
38
|
-
constructor(config) {
|
|
39
|
-
this.
|
|
40
|
-
...config,
|
|
41
|
-
appStoreUrl: config.appStoreUrl ?? DEFAULT_APPSTORE_URL,
|
|
42
|
-
};
|
|
40
|
+
constructor(config = {}) {
|
|
41
|
+
this.appStoreUrl = config.appStoreUrl ?? DEFAULT_APPSTORE_URL;
|
|
43
42
|
this.debug = config.debug ?? false;
|
|
44
43
|
}
|
|
45
44
|
// ============================================
|
|
46
|
-
// Auth Functions
|
|
45
|
+
// Auth Functions
|
|
47
46
|
// ============================================
|
|
48
47
|
/**
|
|
49
|
-
* Issue an access token
|
|
48
|
+
* Issue an app-level or channel-scoped access token.
|
|
50
49
|
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
50
|
+
* Shares the same rate limit as `refreshToken` (10 calls / 30 min per app).
|
|
51
|
+
* Cache the returned token pair and call `refreshToken` on renewal to avoid
|
|
52
|
+
* burning this quota unnecessarily.
|
|
53
|
+
*
|
|
54
|
+
* @param secret App secret (`APP_SECRET`)
|
|
55
|
+
* @param options Pass `channelId` for a channel-scoped token; omit for app-scoped
|
|
56
|
+
* @returns Token pair with `accessToken`, `refreshToken`, and `expiresIn` (seconds)
|
|
53
57
|
*/
|
|
54
|
-
issueToken(options) {
|
|
58
|
+
issueToken(secret, options) {
|
|
55
59
|
const params = {
|
|
56
|
-
secret
|
|
60
|
+
secret,
|
|
57
61
|
...(options?.channelId && { channelId: options.channelId }),
|
|
58
62
|
};
|
|
59
63
|
return this.callNativeFunction("issueToken", params);
|
|
60
64
|
}
|
|
61
65
|
/**
|
|
62
|
-
*
|
|
66
|
+
* Renew an access token using a refresh token.
|
|
67
|
+
*
|
|
68
|
+
* Prefer this over `issueToken` on renewal — both share the same rate limit
|
|
69
|
+
* (10 calls / 30 min), but `refreshToken` does not consume the app secret quota.
|
|
63
70
|
*
|
|
64
|
-
* @param refreshToken
|
|
65
|
-
* @returns New token
|
|
71
|
+
* @param refreshToken Refresh token from a previous `issueToken` or `refreshToken` call
|
|
72
|
+
* @returns New token pair
|
|
66
73
|
*/
|
|
67
74
|
refreshToken(refreshToken) {
|
|
68
75
|
const params = { refreshToken };
|
|
69
76
|
return this.callNativeFunction("refreshToken", params);
|
|
70
77
|
}
|
|
71
78
|
// ============================================
|
|
72
|
-
// Command Functions
|
|
79
|
+
// Command Functions
|
|
73
80
|
// ============================================
|
|
74
81
|
/**
|
|
75
82
|
* Register slash commands for the app
|
|
76
83
|
*
|
|
84
|
+
* @param appId App ID
|
|
77
85
|
* @param commands Commands to register (max 30)
|
|
86
|
+
* @param accessToken Access token (required for RBAC)
|
|
78
87
|
* @returns Registration result
|
|
79
88
|
*/
|
|
80
|
-
registerCommands(commands) {
|
|
89
|
+
registerCommands(appId, commands, accessToken) {
|
|
81
90
|
const params = {
|
|
82
|
-
appId
|
|
91
|
+
appId,
|
|
83
92
|
commands,
|
|
84
93
|
};
|
|
85
|
-
return this.
|
|
94
|
+
return this.callNativeFunctionWithToken("registerCommands", params, accessToken);
|
|
86
95
|
}
|
|
87
96
|
// ============================================
|
|
88
|
-
// Extension Functions
|
|
97
|
+
// Extension Functions
|
|
89
98
|
// ============================================
|
|
90
99
|
/**
|
|
91
100
|
* Register an extension for the app
|
|
92
101
|
*
|
|
102
|
+
* @param appId App ID
|
|
93
103
|
* @param extensionName Extension name (e.g., "calendar", "oauth")
|
|
94
104
|
* @param systemVersion System version (e.g., "v1")
|
|
105
|
+
* @param accessToken Access token (required for RBAC)
|
|
95
106
|
* @returns Registration result
|
|
96
107
|
*/
|
|
97
|
-
registerExtension(extensionName, systemVersion) {
|
|
108
|
+
registerExtension(appId, extensionName, systemVersion, accessToken) {
|
|
98
109
|
const params = {
|
|
99
|
-
appId
|
|
110
|
+
appId,
|
|
100
111
|
systemVersion,
|
|
101
112
|
extensionName,
|
|
102
113
|
};
|
|
103
|
-
return this.
|
|
114
|
+
return this.callNativeFunctionWithToken("registerExtension", params, accessToken);
|
|
104
115
|
}
|
|
105
116
|
/**
|
|
106
117
|
* Unregister an extension for the app
|
|
107
118
|
*
|
|
119
|
+
* @param appId App ID
|
|
108
120
|
* @param extensionName Extension name
|
|
109
121
|
* @param systemVersion System version
|
|
122
|
+
* @param accessToken Access token (required for RBAC)
|
|
110
123
|
* @returns Unregistration result
|
|
111
124
|
*/
|
|
112
|
-
unregisterExtension(extensionName, systemVersion) {
|
|
125
|
+
unregisterExtension(appId, extensionName, systemVersion, accessToken) {
|
|
113
126
|
const params = {
|
|
114
|
-
appId
|
|
127
|
+
appId,
|
|
115
128
|
systemVersion,
|
|
116
129
|
extensionName,
|
|
117
130
|
};
|
|
118
|
-
return this.
|
|
131
|
+
return this.callNativeFunctionWithToken("unregisterExtension", params, accessToken);
|
|
119
132
|
}
|
|
120
133
|
// ============================================
|
|
121
|
-
// ALF Task Functions
|
|
134
|
+
// ALF Task Functions
|
|
122
135
|
// ============================================
|
|
123
136
|
/**
|
|
124
137
|
* Register ALF tasks for the app
|
|
@@ -126,40 +139,40 @@ export class NativeFunctionClient {
|
|
|
126
139
|
* Triggers ch-app-store to call the app's alftask.getTasks function
|
|
127
140
|
* and register the returned tasks.
|
|
128
141
|
*
|
|
142
|
+
* @param appId App ID
|
|
143
|
+
* @param accessToken Access token (required for RBAC)
|
|
129
144
|
* @returns Registration result with counts
|
|
130
145
|
*/
|
|
131
|
-
registerAlfTasks() {
|
|
132
|
-
const params = {
|
|
133
|
-
|
|
134
|
-
};
|
|
135
|
-
return this.callNativeFunction("registerAlfTasks", params);
|
|
146
|
+
registerAlfTasks(appId, accessToken) {
|
|
147
|
+
const params = { appId };
|
|
148
|
+
return this.callNativeFunctionWithToken("registerAlfTasks", params, accessToken);
|
|
136
149
|
}
|
|
137
150
|
/**
|
|
138
151
|
* Get ALF task versions for the app
|
|
139
152
|
*
|
|
153
|
+
* @param appId App ID
|
|
154
|
+
* @param accessToken Access token (required for RBAC)
|
|
140
155
|
* @returns Task version list
|
|
141
156
|
*/
|
|
142
|
-
getAlfTaskVersions() {
|
|
143
|
-
const params = {
|
|
144
|
-
|
|
145
|
-
};
|
|
146
|
-
return this.callNativeFunction("getAlfTaskVersions", params);
|
|
157
|
+
getAlfTaskVersions(appId, accessToken) {
|
|
158
|
+
const params = { appId };
|
|
159
|
+
return this.callNativeFunctionWithToken("getAlfTaskVersions", params, accessToken);
|
|
147
160
|
}
|
|
148
161
|
// ============================================
|
|
149
162
|
// ProxyAPI (typed wrappers for core API)
|
|
150
163
|
// ============================================
|
|
151
164
|
/**
|
|
152
|
-
* Create a typed ProxyAPI wrapper for Channel Talk core API functions
|
|
165
|
+
* Create a typed ProxyAPI wrapper for Channel Talk core API functions.
|
|
153
166
|
*
|
|
154
|
-
* All proxy functions
|
|
155
|
-
* Use `issueToken()` to obtain
|
|
167
|
+
* All proxy functions require a channel-scoped access token.
|
|
168
|
+
* Use `issueToken(secret, { channelId })` to obtain one first.
|
|
156
169
|
*
|
|
157
|
-
* @param accessToken
|
|
170
|
+
* @param accessToken Channel-scoped access token
|
|
158
171
|
* @returns Typed ProxyAPI instance
|
|
159
172
|
*
|
|
160
173
|
* @example
|
|
161
174
|
* ```typescript
|
|
162
|
-
* const { accessToken } = await client.issueToken({ channelId: 'ch-123' });
|
|
175
|
+
* const { accessToken } = await client.issueToken(APP_SECRET, { channelId: 'ch-123' });
|
|
163
176
|
* const api = client.createProxyApi(accessToken);
|
|
164
177
|
*
|
|
165
178
|
* const { message } = await api.writeGroupMessage({
|
|
@@ -183,7 +196,7 @@ export class NativeFunctionClient {
|
|
|
183
196
|
* @returns Function result
|
|
184
197
|
*/
|
|
185
198
|
async callNativeFunction(method, params) {
|
|
186
|
-
const url = `${this.
|
|
199
|
+
const url = `${this.appStoreUrl}/general/v1/native/functions`;
|
|
187
200
|
const request = {
|
|
188
201
|
method,
|
|
189
202
|
...(params && { params }),
|
|
@@ -208,7 +221,7 @@ export class NativeFunctionClient {
|
|
|
208
221
|
* @returns Function result
|
|
209
222
|
*/
|
|
210
223
|
async callNativeFunctionWithToken(method, params, accessToken) {
|
|
211
|
-
const url = `${this.
|
|
224
|
+
const url = `${this.appStoreUrl}/general/v1/native/functions`;
|
|
212
225
|
const request = {
|
|
213
226
|
method,
|
|
214
227
|
params,
|
|
@@ -236,7 +249,7 @@ export class NativeFunctionClient {
|
|
|
236
249
|
* @returns Function result
|
|
237
250
|
*/
|
|
238
251
|
async callAppFunction(appId, method, params, context, accessToken, systemVersion) {
|
|
239
|
-
const url = `${this.
|
|
252
|
+
const url = `${this.appStoreUrl}/general/v1/apps/${appId}/functions`;
|
|
240
253
|
const request = {
|
|
241
254
|
method,
|
|
242
255
|
params,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/native/client.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;GAEG;AACH,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAE5D
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/native/client.ts"],"names":[],"mappings":"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"}
|
package/dist/native/types.d.ts
CHANGED
|
@@ -8,40 +8,19 @@
|
|
|
8
8
|
* Native function client configuration
|
|
9
9
|
*/
|
|
10
10
|
export interface NativeFunctionClientConfig {
|
|
11
|
-
/** App ID */
|
|
12
|
-
appId: string;
|
|
13
|
-
/** App secret */
|
|
14
|
-
appSecret: string;
|
|
15
11
|
/** AppStore API base URL (default: https://app-store.channel.io) */
|
|
16
12
|
appStoreUrl?: string | undefined;
|
|
17
13
|
/** Enable debug logging */
|
|
18
14
|
debug?: boolean | undefined;
|
|
19
15
|
}
|
|
20
|
-
|
|
21
|
-
* Function call context
|
|
22
|
-
*/
|
|
23
|
-
export interface FunctionContext {
|
|
24
|
-
/** Channel information */
|
|
25
|
-
channel: {
|
|
26
|
-
id: string;
|
|
27
|
-
};
|
|
28
|
-
/** Caller information */
|
|
29
|
-
caller: {
|
|
30
|
-
type: "user" | "manager" | "system";
|
|
31
|
-
id: string;
|
|
32
|
-
};
|
|
33
|
-
/** OAuth token (optional) */
|
|
34
|
-
authToken?: string;
|
|
35
|
-
/** API credentials (optional) */
|
|
36
|
-
apiCredentials?: Record<string, string>;
|
|
37
|
-
}
|
|
16
|
+
import type { Context } from "@channel.io/app-sdk-core";
|
|
38
17
|
/**
|
|
39
18
|
* Native function request
|
|
40
19
|
*/
|
|
41
20
|
export interface NativeFunctionRequest<TParams = unknown> {
|
|
42
21
|
method: string;
|
|
43
22
|
params?: TParams;
|
|
44
|
-
context?:
|
|
23
|
+
context?: Context;
|
|
45
24
|
systemVersion?: string;
|
|
46
25
|
}
|
|
47
26
|
/**
|
|
@@ -74,7 +53,6 @@ export interface IssueTokenResult {
|
|
|
74
53
|
accessToken: string;
|
|
75
54
|
refreshToken: string;
|
|
76
55
|
expiresIn: number;
|
|
77
|
-
expiresAt?: number;
|
|
78
56
|
}
|
|
79
57
|
/**
|
|
80
58
|
* Refresh token params
|
|
@@ -189,12 +167,9 @@ export interface RegisterCommandsParams {
|
|
|
189
167
|
commands: CommandDTO[];
|
|
190
168
|
}
|
|
191
169
|
/**
|
|
192
|
-
* Register commands result
|
|
170
|
+
* Register commands result (ch-app-store returns void)
|
|
193
171
|
*/
|
|
194
|
-
export
|
|
195
|
-
/** Whether registration succeeded */
|
|
196
|
-
success: boolean;
|
|
197
|
-
}
|
|
172
|
+
export type RegisterCommandsResult = Record<string, never>;
|
|
198
173
|
/**
|
|
199
174
|
* Register extension params (native function, camelCase)
|
|
200
175
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/native/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/native/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type OnModuleInit } from "@nestjs/common";
|
|
1
|
+
import { type OnApplicationBootstrap, type OnModuleInit } from "@nestjs/common";
|
|
2
|
+
import { HttpAdapterHost } from "@nestjs/core";
|
|
2
3
|
import { type FunctionCallRequest, type FunctionCallResponse, type GetFunctionsResponse } from "@channel.io/app-sdk-core";
|
|
3
4
|
import { type ChannelAppModuleOptions } from "./types.js";
|
|
4
5
|
import { ExtensionDiscoveryService } from "../discovery/extension-discovery.service.js";
|
|
@@ -10,12 +11,27 @@ export declare class VersionMismatchError extends Error {
|
|
|
10
11
|
readonly availableVersions: string[];
|
|
11
12
|
constructor(requestedVersion: string, availableVersions: string[]);
|
|
12
13
|
}
|
|
13
|
-
export declare class ChannelAppService implements OnModuleInit {
|
|
14
|
+
export declare class ChannelAppService implements OnModuleInit, OnApplicationBootstrap {
|
|
14
15
|
private readonly options;
|
|
16
|
+
private readonly httpAdapterHost;
|
|
15
17
|
private readonly discoveryService?;
|
|
16
18
|
private readonly logger;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
private readonly nativeClient;
|
|
20
|
+
private cachedToken;
|
|
21
|
+
constructor(options: ChannelAppModuleOptions, httpAdapterHost: HttpAdapterHost, discoveryService?: ExtensionDiscoveryService | undefined);
|
|
22
|
+
/**
|
|
23
|
+
* Returns a valid app-level access token.
|
|
24
|
+
*
|
|
25
|
+
* Flow:
|
|
26
|
+
* 1. Return cached accessToken if still valid (with 5-min buffer).
|
|
27
|
+
* 2. Use refreshToken to renew if available (preserves issueToken rate limit).
|
|
28
|
+
* 3. Fall back to issueToken only on first call or when refresh fails.
|
|
29
|
+
*
|
|
30
|
+
* issueToken and refreshToken share the same rate limit (10 calls / 30 min).
|
|
31
|
+
*/
|
|
32
|
+
private getAccessToken;
|
|
33
|
+
onModuleInit(): void;
|
|
34
|
+
onApplicationBootstrap(): void;
|
|
19
35
|
/**
|
|
20
36
|
* Default extension name used when no @Extension decorators are found.
|
|
21
37
|
* Apps that only use native functions (e.g., cron bots) still need to
|
|
@@ -27,7 +43,11 @@ export declare class ChannelAppService implements OnModuleInit {
|
|
|
27
43
|
*/
|
|
28
44
|
static readonly DEFAULT_SYSTEM_VERSION = "v1";
|
|
29
45
|
/**
|
|
30
|
-
*
|
|
46
|
+
* Register all extensions with the AppStore.
|
|
47
|
+
*
|
|
48
|
+
* Call this after `app.listen()` to ensure the HTTP server is ready before
|
|
49
|
+
* AppStore attempts its getFunctions callback.
|
|
50
|
+
*
|
|
31
51
|
* If no extensions are discovered via decorators, automatically registers
|
|
32
52
|
* a "core" extension so that extension-less apps (e.g., cron bots) can
|
|
33
53
|
* still have a system version registered.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-app.service.d.ts","sourceRoot":"","sources":["../../src/nestjs/channel-app.service.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"channel-app.service.d.ts","sourceRoot":"","sources":["../../src/nestjs/channel-app.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EAGlB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAEzB,KAAK,oBAAoB,EAE1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,KAAK,uBAAuB,EAE7B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAExF;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,gBAAgB,EAAE,MAAM;aACxB,iBAAiB,EAAE,MAAM,EAAE;gBAD3B,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,EAAE;CAO9C;AAED,qBACa,iBAAkB,YAAW,YAAY,EAAE,sBAAsB;IAY1E,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAdpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IAEpD,OAAO,CAAC,WAAW,CAIH;gBAIG,OAAO,EAAE,uBAAuB,EAChC,eAAe,EAAE,eAAe,EAEhC,gBAAgB,CAAC,EAAE,yBAAyB,YAAA;IAQ/D;;;;;;;;;OASG;YACW,cAAc;IAsB5B,YAAY;IAiCZ,sBAAsB;IAWtB;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,mBAAmB,UAAU;IAE7C;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,sBAAsB,QAAQ;IAE9C;;;;;;;;;OASG;YACW,sBAAsB;IAkCpC;;OAEG;YACW,uBAAuB;IA6CrC;;;;OAIG;IACH,qBAAqB,IAAI,MAAM,EAAE;IAejC;;;;OAIG;IACG,kBAAkB,CACtB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,CAAC;IA8BhC;;OAEG;IACH,YAAY,IAAI,oBAAoB;IA6BpC;;OAEG;IACH,YAAY;;;CAKb"}
|
|
@@ -11,10 +11,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
var ChannelAppService_1;
|
|
14
|
-
import { Inject, Injectable, Logger, Optional } from "@nestjs/common";
|
|
14
|
+
import { Inject, Injectable, Logger, Optional, } from "@nestjs/common";
|
|
15
|
+
import { HttpAdapterHost } from "@nestjs/core";
|
|
15
16
|
import { FunctionNotFoundError, } from "@channel.io/app-sdk-core";
|
|
16
17
|
import { CHANNEL_APP_OPTIONS, } from "./types.js";
|
|
17
|
-
import {
|
|
18
|
+
import { NativeFunctionClient } from "../native/client.js";
|
|
18
19
|
import { ExtensionDiscoveryService } from "../discovery/extension-discovery.service.js";
|
|
19
20
|
/**
|
|
20
21
|
* Version mismatch error for when a function call targets the wrong version
|
|
@@ -32,13 +33,50 @@ export class VersionMismatchError extends Error {
|
|
|
32
33
|
let ChannelAppService = class ChannelAppService {
|
|
33
34
|
static { ChannelAppService_1 = this; }
|
|
34
35
|
options;
|
|
36
|
+
httpAdapterHost;
|
|
35
37
|
discoveryService;
|
|
36
38
|
logger = new Logger(ChannelAppService_1.name);
|
|
37
|
-
|
|
39
|
+
nativeClient;
|
|
40
|
+
cachedToken = null;
|
|
41
|
+
constructor(options, httpAdapterHost, discoveryService) {
|
|
38
42
|
this.options = options;
|
|
43
|
+
this.httpAdapterHost = httpAdapterHost;
|
|
39
44
|
this.discoveryService = discoveryService;
|
|
45
|
+
this.nativeClient = new NativeFunctionClient({
|
|
46
|
+
appStoreUrl: this.options.appStoreUrl,
|
|
47
|
+
debug: this.options.debug,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Returns a valid app-level access token.
|
|
52
|
+
*
|
|
53
|
+
* Flow:
|
|
54
|
+
* 1. Return cached accessToken if still valid (with 5-min buffer).
|
|
55
|
+
* 2. Use refreshToken to renew if available (preserves issueToken rate limit).
|
|
56
|
+
* 3. Fall back to issueToken only on first call or when refresh fails.
|
|
57
|
+
*
|
|
58
|
+
* issueToken and refreshToken share the same rate limit (10 calls / 30 min).
|
|
59
|
+
*/
|
|
60
|
+
async getAccessToken() {
|
|
61
|
+
const bufferMs = 5 * 60 * 1000;
|
|
62
|
+
if (this.cachedToken && Date.now() < this.cachedToken.expiresAt - bufferMs) {
|
|
63
|
+
return this.cachedToken.accessToken;
|
|
64
|
+
}
|
|
65
|
+
if (this.cachedToken?.refreshToken) {
|
|
66
|
+
try {
|
|
67
|
+
const pair = await this.nativeClient.refreshToken(this.cachedToken.refreshToken);
|
|
68
|
+
this.cachedToken = { ...pair, expiresAt: Date.now() + pair.expiresIn * 1000 };
|
|
69
|
+
return pair.accessToken;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// fall through to issueToken
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const pair = await this.nativeClient.issueToken(this.options.appSecret);
|
|
76
|
+
this.cachedToken = { ...pair, expiresAt: Date.now() + pair.expiresIn * 1000 };
|
|
77
|
+
return pair.accessToken;
|
|
40
78
|
}
|
|
41
|
-
|
|
79
|
+
onModuleInit() {
|
|
42
80
|
// Log discovered extensions
|
|
43
81
|
if (this.discoveryService?.hasExtensions()) {
|
|
44
82
|
const extensions = this.discoveryService.getExtensions();
|
|
@@ -64,9 +102,15 @@ let ChannelAppService = class ChannelAppService {
|
|
|
64
102
|
if (standaloneFunctionCount > 0) {
|
|
65
103
|
this.logger.log(`Discovered ${standaloneFunctionCount} standalone function(s)`);
|
|
66
104
|
}
|
|
67
|
-
|
|
105
|
+
}
|
|
106
|
+
onApplicationBootstrap() {
|
|
68
107
|
if (this.options.autoRegister) {
|
|
69
|
-
|
|
108
|
+
// Register extensions only after the HTTP server starts listening.
|
|
109
|
+
// AppStore calls back into our app (e.g., getFunctions) immediately after
|
|
110
|
+
// registration, so the server must be ready to accept requests first.
|
|
111
|
+
const server = this.httpAdapterHost.httpAdapter.getHttpServer();
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
113
|
+
server.once("listening", () => this.autoRegisterExtensions());
|
|
70
114
|
}
|
|
71
115
|
}
|
|
72
116
|
/**
|
|
@@ -80,28 +124,27 @@ let ChannelAppService = class ChannelAppService {
|
|
|
80
124
|
*/
|
|
81
125
|
static DEFAULT_SYSTEM_VERSION = "v1";
|
|
82
126
|
/**
|
|
83
|
-
*
|
|
127
|
+
* Register all extensions with the AppStore.
|
|
128
|
+
*
|
|
129
|
+
* Call this after `app.listen()` to ensure the HTTP server is ready before
|
|
130
|
+
* AppStore attempts its getFunctions callback.
|
|
131
|
+
*
|
|
84
132
|
* If no extensions are discovered via decorators, automatically registers
|
|
85
133
|
* a "core" extension so that extension-less apps (e.g., cron bots) can
|
|
86
134
|
* still have a system version registered.
|
|
87
135
|
*/
|
|
88
136
|
async autoRegisterExtensions() {
|
|
89
|
-
const
|
|
90
|
-
appId: this.options.appId,
|
|
91
|
-
appSecret: this.options.appSecret,
|
|
92
|
-
appStoreUrl: this.options.appStoreUrl,
|
|
93
|
-
debug: this.options.debug,
|
|
94
|
-
});
|
|
137
|
+
const accessToken = await this.getAccessToken();
|
|
95
138
|
const results = [];
|
|
96
139
|
const extensions = this.discoveryService?.getExtensions() ?? [];
|
|
97
140
|
// If no extensions discovered, register "core" extension as fallback
|
|
98
141
|
if (extensions.length === 0) {
|
|
99
142
|
this.logger.log("No extensions discovered. Auto-registering core extension for system version registration.");
|
|
100
|
-
await this.registerSingleExtension(
|
|
143
|
+
await this.registerSingleExtension(accessToken, ChannelAppService_1.CORE_EXTENSION_NAME, ChannelAppService_1.DEFAULT_SYSTEM_VERSION, results);
|
|
101
144
|
}
|
|
102
145
|
else {
|
|
103
146
|
for (const extension of extensions) {
|
|
104
|
-
await this.registerSingleExtension(
|
|
147
|
+
await this.registerSingleExtension(accessToken, extension.name, extension.systemVersion, results);
|
|
105
148
|
}
|
|
106
149
|
}
|
|
107
150
|
// Call callback if provided
|
|
@@ -112,13 +155,10 @@ let ChannelAppService = class ChannelAppService {
|
|
|
112
155
|
/**
|
|
113
156
|
* Register a single extension with the AppStore and collect the result.
|
|
114
157
|
*/
|
|
115
|
-
async registerSingleExtension(
|
|
158
|
+
async registerSingleExtension(accessToken, extensionName, systemVersion, results) {
|
|
116
159
|
try {
|
|
117
160
|
this.logger.log(`Auto-registering extension: ${extensionName} (${systemVersion})`);
|
|
118
|
-
const result = await
|
|
119
|
-
extensionName,
|
|
120
|
-
systemVersion,
|
|
121
|
-
});
|
|
161
|
+
const result = await this.nativeClient.registerExtension(this.options.appId, extensionName, systemVersion, accessToken);
|
|
122
162
|
if (result.success) {
|
|
123
163
|
this.logger.log(`Successfully registered extension: ${extensionName}`);
|
|
124
164
|
results.push({
|
|
@@ -128,7 +168,7 @@ let ChannelAppService = class ChannelAppService {
|
|
|
128
168
|
});
|
|
129
169
|
}
|
|
130
170
|
else {
|
|
131
|
-
const errorMsg = result.
|
|
171
|
+
const errorMsg = result.errorMessage ?? result.validationErrors?.join(", ") ?? "Unknown error";
|
|
132
172
|
this.logger.warn(`Failed to register extension ${extensionName}: ${errorMsg}`);
|
|
133
173
|
results.push({
|
|
134
174
|
extensionName,
|
|
@@ -185,9 +225,13 @@ let ChannelAppService = class ChannelAppService {
|
|
|
185
225
|
}
|
|
186
226
|
if (this.options.debug) {
|
|
187
227
|
this.logger.debug(`Calling function: ${method}`);
|
|
228
|
+
this.logger.debug(`Request: ${JSON.stringify(request)}`);
|
|
188
229
|
}
|
|
189
230
|
// Execute the handler
|
|
190
231
|
const result = await func.handler(context, params ?? {});
|
|
232
|
+
if (this.options.debug) {
|
|
233
|
+
this.logger.debug(`Output: ${JSON.stringify(result)}`);
|
|
234
|
+
}
|
|
191
235
|
return { result };
|
|
192
236
|
}
|
|
193
237
|
/**
|
|
@@ -228,8 +272,9 @@ let ChannelAppService = class ChannelAppService {
|
|
|
228
272
|
ChannelAppService = ChannelAppService_1 = __decorate([
|
|
229
273
|
Injectable(),
|
|
230
274
|
__param(0, Inject(CHANNEL_APP_OPTIONS)),
|
|
231
|
-
__param(
|
|
232
|
-
__metadata("design:paramtypes", [Object,
|
|
275
|
+
__param(2, Optional()),
|
|
276
|
+
__metadata("design:paramtypes", [Object, HttpAdapterHost,
|
|
277
|
+
ExtensionDiscoveryService])
|
|
233
278
|
], ChannelAppService);
|
|
234
279
|
export { ChannelAppService };
|
|
235
280
|
//# sourceMappingURL=channel-app.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-app.service.js","sourceRoot":"","sources":["../../src/nestjs/channel-app.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"channel-app.service.js","sourceRoot":"","sources":["../../src/nestjs/channel-app.service.ts"],"names":[],"mappings":"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"}
|