@channel.io/app-sdk-server 0.2.0 → 0.3.1
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.d.ts +2 -0
- package/dist/__tests__/native-client.test.d.ts.map +1 -0
- package/dist/__tests__/native-client.test.js +256 -0
- package/dist/__tests__/native-client.test.js.map +1 -0
- package/dist/__tests__/proxy-api.test.d.ts +2 -0
- package/dist/__tests__/proxy-api.test.d.ts.map +1 -0
- package/dist/__tests__/proxy-api.test.js +273 -0
- package/dist/__tests__/proxy-api.test.js.map +1 -0
- package/dist/__tests__/signature.test.d.ts +2 -0
- package/dist/__tests__/signature.test.d.ts.map +1 -0
- package/dist/__tests__/signature.test.js +172 -0
- package/dist/__tests__/signature.test.js.map +1 -0
- package/dist/__tests__/token-manager.test.d.ts +2 -0
- package/dist/__tests__/token-manager.test.d.ts.map +1 -0
- package/dist/__tests__/token-manager.test.js +624 -0
- package/dist/__tests__/token-manager.test.js.map +1 -0
- 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/guards/signature.middleware.d.ts +25 -16
- package/dist/guards/signature.middleware.d.ts.map +1 -1
- package/dist/guards/signature.middleware.js +35 -19
- package/dist/guards/signature.middleware.js.map +1 -1
- package/dist/native/client.d.ts +55 -1
- package/dist/native/client.d.ts.map +1 -1
- package/dist/native/client.js +89 -0
- package/dist/native/client.js.map +1 -1
- package/dist/native/index.d.ts +2 -0
- package/dist/native/index.d.ts.map +1 -1
- package/dist/native/index.js +2 -0
- package/dist/native/index.js.map +1 -1
- package/dist/native/proxy-api.d.ts +110 -0
- package/dist/native/proxy-api.d.ts.map +1 -0
- package/dist/native/proxy-api.js +159 -0
- package/dist/native/proxy-api.js.map +1 -0
- package/dist/native/proxy-api.types.d.ts +232 -0
- package/dist/native/proxy-api.types.d.ts.map +1 -0
- package/dist/native/proxy-api.types.js +10 -0
- package/dist/native/proxy-api.types.js.map +1 -0
- package/dist/native/types.d.ts +108 -0
- package/dist/native/types.d.ts.map +1 -1
- package/dist/nestjs/channel-app.service.d.ts +21 -2
- package/dist/nestjs/channel-app.service.d.ts.map +1 -1
- package/dist/nestjs/channel-app.service.js +73 -36
- package/dist/nestjs/channel-app.service.js.map +1 -1
- package/dist/nestjs/channel-app.service.test.d.ts +2 -0
- package/dist/nestjs/channel-app.service.test.d.ts.map +1 -0
- package/dist/nestjs/channel-app.service.test.js +240 -0
- package/dist/nestjs/channel-app.service.test.js.map +1 -0
- package/dist/token/manager.d.ts +33 -1
- package/dist/token/manager.d.ts.map +1 -1
- package/dist/token/manager.js +75 -13
- package/dist/token/manager.js.map +1 -1
- package/package.json +2 -2
|
@@ -29,7 +29,8 @@ export class VersionMismatchError extends Error {
|
|
|
29
29
|
this.name = "VersionMismatchError";
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
let ChannelAppService =
|
|
32
|
+
let ChannelAppService = class ChannelAppService {
|
|
33
|
+
static { ChannelAppService_1 = this; }
|
|
33
34
|
options;
|
|
34
35
|
discoveryService;
|
|
35
36
|
logger = new Logger(ChannelAppService_1.name);
|
|
@@ -51,6 +52,10 @@ let ChannelAppService = ChannelAppService_1 = class ChannelAppService {
|
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
54
|
}
|
|
55
|
+
else if (this.options.autoRegister) {
|
|
56
|
+
this.logger.log("No extensions discovered via decorators. " +
|
|
57
|
+
`Will auto-register "${ChannelAppService_1.CORE_EXTENSION_NAME}" extension.`);
|
|
58
|
+
}
|
|
54
59
|
// Log standalone functions
|
|
55
60
|
const allFunctions = this.discoveryService?.getAllFunctions() ?? [];
|
|
56
61
|
const extensions = this.discoveryService?.getExtensions() ?? [];
|
|
@@ -65,7 +70,20 @@ let ChannelAppService = ChannelAppService_1 = class ChannelAppService {
|
|
|
65
70
|
}
|
|
66
71
|
}
|
|
67
72
|
/**
|
|
68
|
-
*
|
|
73
|
+
* Default extension name used when no @Extension decorators are found.
|
|
74
|
+
* Apps that only use native functions (e.g., cron bots) still need to
|
|
75
|
+
* register a system version; this "core" extension serves that purpose.
|
|
76
|
+
*/
|
|
77
|
+
static CORE_EXTENSION_NAME = "core";
|
|
78
|
+
/**
|
|
79
|
+
* Default system version used for the core extension fallback.
|
|
80
|
+
*/
|
|
81
|
+
static DEFAULT_SYSTEM_VERSION = "v1";
|
|
82
|
+
/**
|
|
83
|
+
* Auto-register all extensions with the AppStore.
|
|
84
|
+
* If no extensions are discovered via decorators, automatically registers
|
|
85
|
+
* a "core" extension so that extension-less apps (e.g., cron bots) can
|
|
86
|
+
* still have a system version registered.
|
|
69
87
|
*/
|
|
70
88
|
async autoRegisterExtensions() {
|
|
71
89
|
const client = new AppStoreClient({
|
|
@@ -76,57 +94,76 @@ let ChannelAppService = ChannelAppService_1 = class ChannelAppService {
|
|
|
76
94
|
});
|
|
77
95
|
const results = [];
|
|
78
96
|
const extensions = this.discoveryService?.getExtensions() ?? [];
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
97
|
+
// If no extensions discovered, register "core" extension as fallback
|
|
98
|
+
if (extensions.length === 0) {
|
|
99
|
+
this.logger.log("No extensions discovered. Auto-registering core extension for system version registration.");
|
|
100
|
+
await this.registerSingleExtension(client, ChannelAppService_1.CORE_EXTENSION_NAME, ChannelAppService_1.DEFAULT_SYSTEM_VERSION, results);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
for (const extension of extensions) {
|
|
104
|
+
await this.registerSingleExtension(client, extension.name, extension.systemVersion, results);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Call callback if provided
|
|
108
|
+
if (this.options.onAutoRegister) {
|
|
109
|
+
this.options.onAutoRegister(results);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Register a single extension with the AppStore and collect the result.
|
|
114
|
+
*/
|
|
115
|
+
async registerSingleExtension(client, extensionName, systemVersion, results) {
|
|
116
|
+
try {
|
|
117
|
+
this.logger.log(`Auto-registering extension: ${extensionName} (${systemVersion})`);
|
|
118
|
+
const result = await client.registerExtension({
|
|
119
|
+
extensionName,
|
|
120
|
+
systemVersion,
|
|
121
|
+
});
|
|
122
|
+
if (result.success) {
|
|
123
|
+
this.logger.log(`Successfully registered extension: ${extensionName}`);
|
|
124
|
+
results.push({
|
|
125
|
+
extensionName,
|
|
85
126
|
systemVersion,
|
|
127
|
+
success: true,
|
|
86
128
|
});
|
|
87
|
-
if (result.success) {
|
|
88
|
-
this.logger.log(`Successfully registered extension: ${extension.name}`);
|
|
89
|
-
results.push({
|
|
90
|
-
extensionName: extension.name,
|
|
91
|
-
systemVersion,
|
|
92
|
-
success: true,
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
const errorMsg = result.error_message ?? result.validation_errors?.join(", ") ?? "Unknown error";
|
|
97
|
-
this.logger.warn(`Failed to register extension ${extension.name}: ${errorMsg}`);
|
|
98
|
-
results.push({
|
|
99
|
-
extensionName: extension.name,
|
|
100
|
-
systemVersion,
|
|
101
|
-
success: false,
|
|
102
|
-
error: errorMsg,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
129
|
}
|
|
106
|
-
|
|
107
|
-
const errorMsg =
|
|
108
|
-
this.logger.
|
|
130
|
+
else {
|
|
131
|
+
const errorMsg = result.error_message ?? result.validation_errors?.join(", ") ?? "Unknown error";
|
|
132
|
+
this.logger.warn(`Failed to register extension ${extensionName}: ${errorMsg}`);
|
|
109
133
|
results.push({
|
|
110
|
-
extensionName
|
|
134
|
+
extensionName,
|
|
111
135
|
systemVersion,
|
|
112
136
|
success: false,
|
|
113
137
|
error: errorMsg,
|
|
114
138
|
});
|
|
115
139
|
}
|
|
116
140
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
this.
|
|
141
|
+
catch (error) {
|
|
142
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
143
|
+
this.logger.error(`Error registering extension ${extensionName}: ${errorMsg}`);
|
|
144
|
+
results.push({
|
|
145
|
+
extensionName,
|
|
146
|
+
systemVersion,
|
|
147
|
+
success: false,
|
|
148
|
+
error: errorMsg,
|
|
149
|
+
});
|
|
120
150
|
}
|
|
121
151
|
}
|
|
122
152
|
/**
|
|
123
|
-
* Get all registered versions
|
|
153
|
+
* Get all registered versions.
|
|
154
|
+
* When no extensions are discovered and autoRegister is enabled,
|
|
155
|
+
* returns the default system version ("v1") for the core extension.
|
|
124
156
|
*/
|
|
125
157
|
getRegisteredVersions() {
|
|
126
158
|
const versions = new Set();
|
|
127
159
|
const extensions = this.discoveryService?.getExtensions() ?? [];
|
|
128
|
-
|
|
129
|
-
versions.add(
|
|
160
|
+
if (extensions.length === 0 && this.options.autoRegister) {
|
|
161
|
+
versions.add(ChannelAppService_1.DEFAULT_SYSTEM_VERSION);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
for (const ext of extensions) {
|
|
165
|
+
versions.add(ext.systemVersion);
|
|
166
|
+
}
|
|
130
167
|
}
|
|
131
168
|
return Array.from(versions);
|
|
132
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-app.service.js","sourceRoot":"","sources":["../../src/nestjs/channel-app.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAqB,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAKL,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,mBAAmB,GAGpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAExF;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAE3B;IACA;IAFlB,YACkB,gBAAwB,EACxB,iBAA2B;QAE3C,KAAK,CACH,YAAY,gBAAgB,oCAAoC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/F,CAAC;QALc,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,sBAAiB,GAAjB,iBAAiB,CAAU;QAK3C,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAGM,IAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"channel-app.service.js","sourceRoot":"","sources":["../../src/nestjs/channel-app.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-app.service.test.d.ts","sourceRoot":"","sources":["../../src/nestjs/channel-app.service.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { ChannelAppService } from "./channel-app.service.js";
|
|
3
|
+
// Mock AppStoreClient
|
|
4
|
+
vi.mock("../appstore/client.js", () => {
|
|
5
|
+
return {
|
|
6
|
+
AppStoreClient: vi.fn().mockImplementation(() => ({
|
|
7
|
+
registerExtension: vi.fn().mockResolvedValue({ success: true }),
|
|
8
|
+
})),
|
|
9
|
+
};
|
|
10
|
+
});
|
|
11
|
+
// Import after mock so we can inspect calls
|
|
12
|
+
import { AppStoreClient } from "../appstore/client.js";
|
|
13
|
+
function createMockDiscoveryService(extensions = []) {
|
|
14
|
+
return {
|
|
15
|
+
hasExtensions: () => extensions.length > 0,
|
|
16
|
+
getExtensions: () => extensions,
|
|
17
|
+
getExtension: (name) => extensions.find((e) => e.name === name),
|
|
18
|
+
getFunction: () => undefined,
|
|
19
|
+
getAllFunctions: () => [],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function createService(options, discoveryService) {
|
|
23
|
+
// Use Object.defineProperty to set the private fields since the constructor
|
|
24
|
+
// uses @Inject/@Optional decorators that we can't use outside NestJS
|
|
25
|
+
const service = Object.create(ChannelAppService.prototype);
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
const s = service;
|
|
28
|
+
s.options = options;
|
|
29
|
+
s.discoveryService = discoveryService;
|
|
30
|
+
s.logger = {
|
|
31
|
+
log: vi.fn(),
|
|
32
|
+
warn: vi.fn(),
|
|
33
|
+
error: vi.fn(),
|
|
34
|
+
debug: vi.fn(),
|
|
35
|
+
};
|
|
36
|
+
return service;
|
|
37
|
+
}
|
|
38
|
+
describe("ChannelAppService", () => {
|
|
39
|
+
beforeEach(() => {
|
|
40
|
+
vi.clearAllMocks();
|
|
41
|
+
});
|
|
42
|
+
describe("core extension auto-registration", () => {
|
|
43
|
+
it("should register 'core' extension when no extensions are discovered and autoRegister is true", async () => {
|
|
44
|
+
const onAutoRegister = vi.fn();
|
|
45
|
+
const options = {
|
|
46
|
+
appId: "test-app",
|
|
47
|
+
appSecret: "test-secret",
|
|
48
|
+
autoRegister: true,
|
|
49
|
+
onAutoRegister,
|
|
50
|
+
};
|
|
51
|
+
const discovery = createMockDiscoveryService([]);
|
|
52
|
+
const service = createService(options, discovery);
|
|
53
|
+
await service.onModuleInit();
|
|
54
|
+
// Verify AppStoreClient was constructed with correct config
|
|
55
|
+
expect(AppStoreClient).toHaveBeenCalledWith({
|
|
56
|
+
appId: "test-app",
|
|
57
|
+
appSecret: "test-secret",
|
|
58
|
+
appStoreUrl: undefined,
|
|
59
|
+
debug: undefined,
|
|
60
|
+
});
|
|
61
|
+
// Verify registerExtension was called with "core" and "v1"
|
|
62
|
+
const clientInstance = vi.mocked(AppStoreClient).mock.results[0]?.value;
|
|
63
|
+
expect(clientInstance.registerExtension).toHaveBeenCalledWith({
|
|
64
|
+
extensionName: "core",
|
|
65
|
+
systemVersion: "v1",
|
|
66
|
+
});
|
|
67
|
+
// Verify callback was called with success result
|
|
68
|
+
expect(onAutoRegister).toHaveBeenCalledWith([
|
|
69
|
+
{
|
|
70
|
+
extensionName: "core",
|
|
71
|
+
systemVersion: "v1",
|
|
72
|
+
success: true,
|
|
73
|
+
},
|
|
74
|
+
]);
|
|
75
|
+
});
|
|
76
|
+
it("should register 'core' extension when discoveryService is undefined and autoRegister is true", async () => {
|
|
77
|
+
const onAutoRegister = vi.fn();
|
|
78
|
+
const options = {
|
|
79
|
+
appId: "test-app",
|
|
80
|
+
appSecret: "test-secret",
|
|
81
|
+
autoRegister: true,
|
|
82
|
+
onAutoRegister,
|
|
83
|
+
};
|
|
84
|
+
const service = createService(options, undefined);
|
|
85
|
+
await service.onModuleInit();
|
|
86
|
+
const clientInstance = vi.mocked(AppStoreClient).mock.results[0]?.value;
|
|
87
|
+
expect(clientInstance.registerExtension).toHaveBeenCalledWith({
|
|
88
|
+
extensionName: "core",
|
|
89
|
+
systemVersion: "v1",
|
|
90
|
+
});
|
|
91
|
+
expect(onAutoRegister).toHaveBeenCalledWith([
|
|
92
|
+
{
|
|
93
|
+
extensionName: "core",
|
|
94
|
+
systemVersion: "v1",
|
|
95
|
+
success: true,
|
|
96
|
+
},
|
|
97
|
+
]);
|
|
98
|
+
});
|
|
99
|
+
it("should register discovered extensions instead of 'core' when extensions exist", async () => {
|
|
100
|
+
const onAutoRegister = vi.fn();
|
|
101
|
+
const options = {
|
|
102
|
+
appId: "test-app",
|
|
103
|
+
appSecret: "test-secret",
|
|
104
|
+
autoRegister: true,
|
|
105
|
+
onAutoRegister,
|
|
106
|
+
};
|
|
107
|
+
const extensions = [
|
|
108
|
+
{
|
|
109
|
+
name: "calendar",
|
|
110
|
+
systemVersion: "v1",
|
|
111
|
+
exclusive: false,
|
|
112
|
+
instance: {},
|
|
113
|
+
functions: [],
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
const discovery = createMockDiscoveryService(extensions);
|
|
117
|
+
const service = createService(options, discovery);
|
|
118
|
+
await service.onModuleInit();
|
|
119
|
+
const clientInstance = vi.mocked(AppStoreClient).mock.results[0]?.value;
|
|
120
|
+
expect(clientInstance.registerExtension).toHaveBeenCalledWith({
|
|
121
|
+
extensionName: "calendar",
|
|
122
|
+
systemVersion: "v1",
|
|
123
|
+
});
|
|
124
|
+
expect(clientInstance.registerExtension).not.toHaveBeenCalledWith({
|
|
125
|
+
extensionName: "core",
|
|
126
|
+
systemVersion: "v1",
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
it("should not auto-register anything when autoRegister is false", async () => {
|
|
130
|
+
const options = {
|
|
131
|
+
appId: "test-app",
|
|
132
|
+
appSecret: "test-secret",
|
|
133
|
+
autoRegister: false,
|
|
134
|
+
};
|
|
135
|
+
const discovery = createMockDiscoveryService([]);
|
|
136
|
+
const service = createService(options, discovery);
|
|
137
|
+
await service.onModuleInit();
|
|
138
|
+
expect(AppStoreClient).not.toHaveBeenCalled();
|
|
139
|
+
});
|
|
140
|
+
it("should handle registration failure for core extension gracefully", async () => {
|
|
141
|
+
vi.mocked(AppStoreClient).mockImplementationOnce(() => ({
|
|
142
|
+
registerExtension: vi.fn().mockResolvedValue({
|
|
143
|
+
success: false,
|
|
144
|
+
error_message: "Registration denied",
|
|
145
|
+
}),
|
|
146
|
+
}));
|
|
147
|
+
const onAutoRegister = vi.fn();
|
|
148
|
+
const options = {
|
|
149
|
+
appId: "test-app",
|
|
150
|
+
appSecret: "test-secret",
|
|
151
|
+
autoRegister: true,
|
|
152
|
+
onAutoRegister,
|
|
153
|
+
};
|
|
154
|
+
const discovery = createMockDiscoveryService([]);
|
|
155
|
+
const service = createService(options, discovery);
|
|
156
|
+
await service.onModuleInit();
|
|
157
|
+
expect(onAutoRegister).toHaveBeenCalledWith([
|
|
158
|
+
{
|
|
159
|
+
extensionName: "core",
|
|
160
|
+
systemVersion: "v1",
|
|
161
|
+
success: false,
|
|
162
|
+
error: "Registration denied",
|
|
163
|
+
},
|
|
164
|
+
]);
|
|
165
|
+
});
|
|
166
|
+
it("should handle registration exception for core extension gracefully", async () => {
|
|
167
|
+
vi.mocked(AppStoreClient).mockImplementationOnce(() => ({
|
|
168
|
+
registerExtension: vi.fn().mockRejectedValue(new Error("Network error")),
|
|
169
|
+
}));
|
|
170
|
+
const onAutoRegister = vi.fn();
|
|
171
|
+
const options = {
|
|
172
|
+
appId: "test-app",
|
|
173
|
+
appSecret: "test-secret",
|
|
174
|
+
autoRegister: true,
|
|
175
|
+
onAutoRegister,
|
|
176
|
+
};
|
|
177
|
+
const discovery = createMockDiscoveryService([]);
|
|
178
|
+
const service = createService(options, discovery);
|
|
179
|
+
await service.onModuleInit();
|
|
180
|
+
expect(onAutoRegister).toHaveBeenCalledWith([
|
|
181
|
+
{
|
|
182
|
+
extensionName: "core",
|
|
183
|
+
systemVersion: "v1",
|
|
184
|
+
success: false,
|
|
185
|
+
error: "Network error",
|
|
186
|
+
},
|
|
187
|
+
]);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
describe("getRegisteredVersions", () => {
|
|
191
|
+
it("should return default version when no extensions and autoRegister is true", () => {
|
|
192
|
+
const options = {
|
|
193
|
+
appId: "test-app",
|
|
194
|
+
appSecret: "test-secret",
|
|
195
|
+
autoRegister: true,
|
|
196
|
+
};
|
|
197
|
+
const discovery = createMockDiscoveryService([]);
|
|
198
|
+
const service = createService(options, discovery);
|
|
199
|
+
expect(service.getRegisteredVersions()).toEqual(["v1"]);
|
|
200
|
+
});
|
|
201
|
+
it("should return empty array when no extensions and autoRegister is false", () => {
|
|
202
|
+
const options = {
|
|
203
|
+
appId: "test-app",
|
|
204
|
+
appSecret: "test-secret",
|
|
205
|
+
autoRegister: false,
|
|
206
|
+
};
|
|
207
|
+
const discovery = createMockDiscoveryService([]);
|
|
208
|
+
const service = createService(options, discovery);
|
|
209
|
+
expect(service.getRegisteredVersions()).toEqual([]);
|
|
210
|
+
});
|
|
211
|
+
it("should return versions from discovered extensions", () => {
|
|
212
|
+
const options = {
|
|
213
|
+
appId: "test-app",
|
|
214
|
+
appSecret: "test-secret",
|
|
215
|
+
autoRegister: true,
|
|
216
|
+
};
|
|
217
|
+
const extensions = [
|
|
218
|
+
{
|
|
219
|
+
name: "calendar",
|
|
220
|
+
systemVersion: "v2",
|
|
221
|
+
exclusive: false,
|
|
222
|
+
instance: {},
|
|
223
|
+
functions: [],
|
|
224
|
+
},
|
|
225
|
+
];
|
|
226
|
+
const discovery = createMockDiscoveryService(extensions);
|
|
227
|
+
const service = createService(options, discovery);
|
|
228
|
+
expect(service.getRegisteredVersions()).toEqual(["v2"]);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
describe("static constants", () => {
|
|
232
|
+
it("should expose CORE_EXTENSION_NAME as 'core'", () => {
|
|
233
|
+
expect(ChannelAppService.CORE_EXTENSION_NAME).toBe("core");
|
|
234
|
+
});
|
|
235
|
+
it("should expose DEFAULT_SYSTEM_VERSION as 'v1'", () => {
|
|
236
|
+
expect(ChannelAppService.DEFAULT_SYSTEM_VERSION).toBe("v1");
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
//# sourceMappingURL=channel-app.service.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-app.service.test.js","sourceRoot":"","sources":["../../src/nestjs/channel-app.service.test.ts"],"names":[],"mappings":"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"}
|
package/dist/token/manager.d.ts
CHANGED
|
@@ -34,6 +34,17 @@ export declare class TokenManager {
|
|
|
34
34
|
private readonly config;
|
|
35
35
|
private readonly cache;
|
|
36
36
|
private readonly debug;
|
|
37
|
+
/**
|
|
38
|
+
* In-flight promise map to prevent thundering herd.
|
|
39
|
+
* When multiple callers request the same token concurrently,
|
|
40
|
+
* only one actual API call is made and the result is shared.
|
|
41
|
+
*/
|
|
42
|
+
private readonly inFlight;
|
|
43
|
+
/**
|
|
44
|
+
* Generation counter to prevent stale in-flight promises from overwriting
|
|
45
|
+
* cache after invalidateToken() or clearCache() is called.
|
|
46
|
+
*/
|
|
47
|
+
private cacheGeneration;
|
|
37
48
|
constructor(config: TokenManagerConfig);
|
|
38
49
|
/**
|
|
39
50
|
* Get a manager token with automatic caching and refresh
|
|
@@ -47,6 +58,14 @@ export declare class TokenManager {
|
|
|
47
58
|
* Get a channel token with automatic caching and refresh
|
|
48
59
|
*/
|
|
49
60
|
getChannelToken(request: ChannelTokenRequest): Promise<TokenResponse>;
|
|
61
|
+
/**
|
|
62
|
+
* Get an app-level token with automatic caching and refresh.
|
|
63
|
+
*
|
|
64
|
+
* App tokens are not scoped to a channel and are used for app-level
|
|
65
|
+
* operations such as `registerExtension`, `registerCommands`, and
|
|
66
|
+
* `registerAlfTasks`.
|
|
67
|
+
*/
|
|
68
|
+
getAppToken(): Promise<TokenResponse>;
|
|
50
69
|
/**
|
|
51
70
|
* Manually refresh a token (bypass cache)
|
|
52
71
|
*/
|
|
@@ -54,15 +73,24 @@ export declare class TokenManager {
|
|
|
54
73
|
/**
|
|
55
74
|
* Invalidate a cached token
|
|
56
75
|
*/
|
|
76
|
+
invalidateToken(type: "app", channelId?: undefined, entityId?: undefined): Promise<void>;
|
|
57
77
|
invalidateToken(type: "manager" | "user" | "channel", channelId: string, entityId?: string): Promise<void>;
|
|
58
78
|
/**
|
|
59
79
|
* Clear all cached tokens
|
|
60
80
|
*/
|
|
61
81
|
clearCache(): Promise<void>;
|
|
62
82
|
/**
|
|
63
|
-
* Get or refresh a token with automatic caching
|
|
83
|
+
* Get or refresh a token with automatic caching and thundering herd prevention.
|
|
84
|
+
*
|
|
85
|
+
* When multiple concurrent callers request the same token, only one API call
|
|
86
|
+
* is made. Subsequent callers await the same in-flight promise.
|
|
64
87
|
*/
|
|
65
88
|
private getOrRefreshToken;
|
|
89
|
+
/**
|
|
90
|
+
* Deduplicate concurrent requests for the same cache key.
|
|
91
|
+
* If there's already an in-flight request, return its promise instead of starting a new one.
|
|
92
|
+
*/
|
|
93
|
+
private dedup;
|
|
66
94
|
/**
|
|
67
95
|
* Issue a manager token
|
|
68
96
|
*/
|
|
@@ -75,6 +103,10 @@ export declare class TokenManager {
|
|
|
75
103
|
* Issue a channel token
|
|
76
104
|
*/
|
|
77
105
|
private issueChannelToken;
|
|
106
|
+
/**
|
|
107
|
+
* Issue an app-level token (no channelId required)
|
|
108
|
+
*/
|
|
109
|
+
private issueAppToken;
|
|
78
110
|
/**
|
|
79
111
|
* Cache a token
|
|
80
112
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/token/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EAEb,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAiCpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGF;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0D;IAChF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/token/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EAEb,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAiCpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGF;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0D;IAChF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAEhC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IAEtE;;;OAGG;IACH,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,EAAE,kBAAkB;IAUtC;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAK3E;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAKrE;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAK3E;;;;;;OAMG;IACG,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC;IAK3C;;OAEG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAQhE;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IACxF,eAAe,CACnB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,EACpC,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAYhB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;;;;OAKG;YACW,iBAAiB;IAgD/B;;;OAGG;YACW,KAAK;IAcnB;;OAEG;YACW,iBAAiB;IAQ/B;;OAEG;YACW,cAAc;IAQ5B;;OAEG;YACW,iBAAiB;IAQ/B;;OAEG;YACW,aAAa;IAK3B;;OAEG;YACW,UAAU;IAWxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;YACW,UAAU;IA0BxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;OAEG;IACH,OAAO,CAAC,GAAG;IAUX;;OAEG;IACH,OAAO,IAAI,IAAI;CAKhB;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,UAAU,CAAC,EAAE,MAAM;aACnB,YAAY,CAAC,EAAE,MAAM;gBAFrC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,YAAY,CAAC,EAAE,MAAM,YAAA;CAKxC"}
|