@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.
Files changed (55) hide show
  1. package/dist/__tests__/native-client.test.d.ts +2 -0
  2. package/dist/__tests__/native-client.test.d.ts.map +1 -0
  3. package/dist/__tests__/native-client.test.js +256 -0
  4. package/dist/__tests__/native-client.test.js.map +1 -0
  5. package/dist/__tests__/proxy-api.test.d.ts +2 -0
  6. package/dist/__tests__/proxy-api.test.d.ts.map +1 -0
  7. package/dist/__tests__/proxy-api.test.js +273 -0
  8. package/dist/__tests__/proxy-api.test.js.map +1 -0
  9. package/dist/__tests__/signature.test.d.ts +2 -0
  10. package/dist/__tests__/signature.test.d.ts.map +1 -0
  11. package/dist/__tests__/signature.test.js +172 -0
  12. package/dist/__tests__/signature.test.js.map +1 -0
  13. package/dist/__tests__/token-manager.test.d.ts +2 -0
  14. package/dist/__tests__/token-manager.test.d.ts.map +1 -0
  15. package/dist/__tests__/token-manager.test.js +624 -0
  16. package/dist/__tests__/token-manager.test.js.map +1 -0
  17. package/dist/decorators/extension-names.d.ts +1 -1
  18. package/dist/decorators/extension-names.d.ts.map +1 -1
  19. package/dist/decorators/extension-names.js +1 -0
  20. package/dist/decorators/extension-names.js.map +1 -1
  21. package/dist/guards/signature.middleware.d.ts +25 -16
  22. package/dist/guards/signature.middleware.d.ts.map +1 -1
  23. package/dist/guards/signature.middleware.js +35 -19
  24. package/dist/guards/signature.middleware.js.map +1 -1
  25. package/dist/native/client.d.ts +55 -1
  26. package/dist/native/client.d.ts.map +1 -1
  27. package/dist/native/client.js +89 -0
  28. package/dist/native/client.js.map +1 -1
  29. package/dist/native/index.d.ts +2 -0
  30. package/dist/native/index.d.ts.map +1 -1
  31. package/dist/native/index.js +2 -0
  32. package/dist/native/index.js.map +1 -1
  33. package/dist/native/proxy-api.d.ts +110 -0
  34. package/dist/native/proxy-api.d.ts.map +1 -0
  35. package/dist/native/proxy-api.js +159 -0
  36. package/dist/native/proxy-api.js.map +1 -0
  37. package/dist/native/proxy-api.types.d.ts +232 -0
  38. package/dist/native/proxy-api.types.d.ts.map +1 -0
  39. package/dist/native/proxy-api.types.js +10 -0
  40. package/dist/native/proxy-api.types.js.map +1 -0
  41. package/dist/native/types.d.ts +108 -0
  42. package/dist/native/types.d.ts.map +1 -1
  43. package/dist/nestjs/channel-app.service.d.ts +21 -2
  44. package/dist/nestjs/channel-app.service.d.ts.map +1 -1
  45. package/dist/nestjs/channel-app.service.js +73 -36
  46. package/dist/nestjs/channel-app.service.js.map +1 -1
  47. package/dist/nestjs/channel-app.service.test.d.ts +2 -0
  48. package/dist/nestjs/channel-app.service.test.d.ts.map +1 -0
  49. package/dist/nestjs/channel-app.service.test.js +240 -0
  50. package/dist/nestjs/channel-app.service.test.js.map +1 -0
  51. package/dist/token/manager.d.ts +33 -1
  52. package/dist/token/manager.d.ts.map +1 -1
  53. package/dist/token/manager.js +75 -13
  54. package/dist/token/manager.js.map +1 -1
  55. 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 = ChannelAppService_1 = class 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
- * Auto-register all extensions with the AppStore
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
- for (const extension of extensions) {
80
- const systemVersion = extension.systemVersion;
81
- try {
82
- this.logger.log(`Auto-registering extension: ${extension.name} (${systemVersion})`);
83
- const result = await client.registerExtension({
84
- extensionName: extension.name,
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
- catch (error) {
107
- const errorMsg = error instanceof Error ? error.message : String(error);
108
- this.logger.error(`Error registering extension ${extension.name}: ${errorMsg}`);
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: extension.name,
134
+ extensionName,
111
135
  systemVersion,
112
136
  success: false,
113
137
  error: errorMsg,
114
138
  });
115
139
  }
116
140
  }
117
- // Call callback if provided
118
- if (this.options.onAutoRegister) {
119
- this.options.onAutoRegister(results);
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
- for (const ext of extensions) {
129
- versions.add(ext.systemVersion);
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":"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"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=channel-app.service.test.d.ts.map
@@ -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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"}
@@ -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;gBAEpB,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;;OAEG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAQhE;;OAEG;IACG,eAAe,CACnB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,EACpC,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAKhB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;YACW,iBAAiB;IAqC/B;;OAEG;YACW,iBAAiB;IAQ/B;;OAEG;YACW,cAAc;IAQ5B;;OAEG;YACW,iBAAiB;IAQ/B;;OAEG;YACW,UAAU;IAWxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;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"}
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"}