@samanhappy/mcphub 0.10.6 → 0.11.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/README.fr.md +36 -152
- package/README.md +34 -255
- package/README.zh.md +33 -212
- package/dist/config/DaoConfigService.js +3 -3
- package/dist/config/DaoConfigService.js.map +1 -1
- package/dist/controllers/authController.js +2 -2
- package/dist/controllers/authController.js.map +1 -1
- package/dist/controllers/groupController.js +24 -24
- package/dist/controllers/groupController.js.map +1 -1
- package/dist/controllers/openApiController.js +1 -1
- package/dist/controllers/openApiController.js.map +1 -1
- package/dist/controllers/serverController.js +95 -61
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/controllers/userController.js +22 -21
- package/dist/controllers/userController.js.map +1 -1
- package/dist/dao/DaoFactory.js +19 -0
- package/dist/dao/DaoFactory.js.map +1 -1
- package/dist/dao/DatabaseDaoFactory.js +68 -0
- package/dist/dao/DatabaseDaoFactory.js.map +1 -0
- package/dist/dao/GroupDaoDbImpl.js +131 -0
- package/dist/dao/GroupDaoDbImpl.js.map +1 -0
- package/dist/dao/ServerDaoDbImpl.js +109 -0
- package/dist/dao/ServerDaoDbImpl.js.map +1 -0
- package/dist/dao/SystemConfigDaoDbImpl.js +56 -0
- package/dist/dao/SystemConfigDaoDbImpl.js.map +1 -0
- package/dist/dao/UserConfigDaoDbImpl.js +61 -0
- package/dist/dao/UserConfigDaoDbImpl.js.map +1 -0
- package/dist/dao/UserDaoDbImpl.js +90 -0
- package/dist/dao/UserDaoDbImpl.js.map +1 -0
- package/dist/dao/index.js +7 -0
- package/dist/dao/index.js.map +1 -1
- package/dist/db/entities/Group.js +49 -0
- package/dist/db/entities/Group.js.map +1 -0
- package/dist/db/entities/Server.js +93 -0
- package/dist/db/entities/Server.js.map +1 -0
- package/dist/db/entities/SystemConfig.js +66 -0
- package/dist/db/entities/SystemConfig.js.map +1 -0
- package/dist/db/entities/User.js +45 -0
- package/dist/db/entities/User.js.map +1 -0
- package/dist/db/entities/UserConfig.js +45 -0
- package/dist/db/entities/UserConfig.js.map +1 -0
- package/dist/db/entities/index.js +7 -2
- package/dist/db/entities/index.js.map +1 -1
- package/dist/db/repositories/GroupRepository.js +81 -0
- package/dist/db/repositories/GroupRepository.js.map +1 -0
- package/dist/db/repositories/ServerRepository.js +80 -0
- package/dist/db/repositories/ServerRepository.js.map +1 -0
- package/dist/db/repositories/SystemConfigRepository.js +64 -0
- package/dist/db/repositories/SystemConfigRepository.js.map +1 -0
- package/dist/db/repositories/UserConfigRepository.js +69 -0
- package/dist/db/repositories/UserConfigRepository.js.map +1 -0
- package/dist/db/repositories/UserRepository.js +68 -0
- package/dist/db/repositories/UserRepository.js.map +1 -0
- package/dist/db/repositories/index.js +6 -1
- package/dist/db/repositories/index.js.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/middlewares/auth.js +1 -1
- package/dist/middlewares/auth.js.map +1 -1
- package/dist/middlewares/userContext.js +1 -1
- package/dist/middlewares/userContext.js.map +1 -1
- package/dist/models/User.js +29 -48
- package/dist/models/User.js.map +1 -1
- package/dist/routes/index.js +2 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/scripts/migrate-to-database.js +5 -0
- package/dist/scripts/migrate-to-database.js.map +1 -0
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/services/groupService.js +87 -113
- package/dist/services/groupService.js.map +1 -1
- package/dist/services/keepAliveService.js +58 -0
- package/dist/services/keepAliveService.js.map +1 -0
- package/dist/services/mcpOAuthProvider.js +22 -28
- package/dist/services/mcpOAuthProvider.js.map +1 -1
- package/dist/services/mcpService.js +73 -92
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/oauthServerService.js +18 -12
- package/dist/services/oauthServerService.js.map +1 -1
- package/dist/services/oauthService.js +11 -10
- package/dist/services/oauthService.js.map +1 -1
- package/dist/services/oauthSettingsStore.js +17 -12
- package/dist/services/oauthSettingsStore.js.map +1 -1
- package/dist/services/openApiGeneratorService.js +6 -7
- package/dist/services/openApiGeneratorService.js.map +1 -1
- package/dist/services/sseService.js +20 -62
- package/dist/services/sseService.js.map +1 -1
- package/dist/services/userService.js +38 -45
- package/dist/services/userService.js.map +1 -1
- package/dist/utils/migration.js +184 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/oauthBearer.js +3 -3
- package/dist/utils/oauthBearer.js.map +1 -1
- package/frontend/dist/assets/index-Dno2pywv.js +251 -0
- package/frontend/dist/assets/index-Dno2pywv.js.map +1 -0
- package/frontend/dist/index.html +1 -1
- package/mcp_settings.json +23 -1
- package/package.json +1 -1
- package/frontend/dist/assets/index-DDht0WYq.js +0 -251
- package/frontend/dist/assets/index-DDht0WYq.js.map +0 -1
|
@@ -1,27 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { saveSettings, loadSettings } from '../config/index.js';
|
|
3
|
-
import bcrypt from 'bcryptjs';
|
|
1
|
+
import { getUserDao } from '../dao/index.js';
|
|
4
2
|
// Get all users
|
|
5
|
-
export const getAllUsers = () => {
|
|
6
|
-
|
|
3
|
+
export const getAllUsers = async () => {
|
|
4
|
+
const userDao = getUserDao();
|
|
5
|
+
return await userDao.findAll();
|
|
7
6
|
};
|
|
8
7
|
// Get user by username
|
|
9
|
-
export const getUserByUsername = (username) => {
|
|
10
|
-
|
|
8
|
+
export const getUserByUsername = async (username) => {
|
|
9
|
+
const userDao = getUserDao();
|
|
10
|
+
const user = await userDao.findByUsername(username);
|
|
11
|
+
return user || undefined;
|
|
11
12
|
};
|
|
12
13
|
// Create a new user
|
|
13
14
|
export const createNewUser = async (username, password, isAdmin = false) => {
|
|
14
15
|
try {
|
|
15
|
-
const
|
|
16
|
+
const userDao = getUserDao();
|
|
17
|
+
const existingUser = await userDao.findByUsername(username);
|
|
16
18
|
if (existingUser) {
|
|
17
19
|
return null; // User already exists
|
|
18
20
|
}
|
|
19
|
-
|
|
20
|
-
username,
|
|
21
|
-
password,
|
|
22
|
-
isAdmin,
|
|
23
|
-
};
|
|
24
|
-
return await createUser(userData);
|
|
21
|
+
return await userDao.createWithHashedPassword(username, password, isAdmin);
|
|
25
22
|
}
|
|
26
23
|
catch (error) {
|
|
27
24
|
console.error('Failed to create user:', error);
|
|
@@ -31,29 +28,27 @@ export const createNewUser = async (username, password, isAdmin = false) => {
|
|
|
31
28
|
// Update user information
|
|
32
29
|
export const updateUser = async (username, data) => {
|
|
33
30
|
try {
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
31
|
+
const userDao = getUserDao();
|
|
32
|
+
const user = await userDao.findByUsername(username);
|
|
33
|
+
if (!user) {
|
|
37
34
|
return null;
|
|
38
35
|
}
|
|
39
|
-
const user = users[userIndex];
|
|
40
36
|
// Update admin status if provided
|
|
41
37
|
if (data.isAdmin !== undefined) {
|
|
42
|
-
|
|
38
|
+
const result = await userDao.update(username, { isAdmin: data.isAdmin });
|
|
39
|
+
if (!result) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
43
42
|
}
|
|
44
43
|
// Update password if provided
|
|
45
44
|
if (data.newPassword) {
|
|
46
|
-
const
|
|
47
|
-
|
|
45
|
+
const success = await userDao.updatePassword(username, data.newPassword);
|
|
46
|
+
if (!success) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
48
49
|
}
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
const settings = loadSettings();
|
|
52
|
-
settings.users = users;
|
|
53
|
-
if (!saveSettings(settings)) {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
return user;
|
|
50
|
+
// Return updated user
|
|
51
|
+
return await userDao.findByUsername(username);
|
|
57
52
|
}
|
|
58
53
|
catch (error) {
|
|
59
54
|
console.error('Failed to update user:', error);
|
|
@@ -61,23 +56,17 @@ export const updateUser = async (username, data) => {
|
|
|
61
56
|
}
|
|
62
57
|
};
|
|
63
58
|
// Delete a user
|
|
64
|
-
export const deleteUser = (username) => {
|
|
59
|
+
export const deleteUser = async (username) => {
|
|
65
60
|
try {
|
|
61
|
+
const userDao = getUserDao();
|
|
66
62
|
// Cannot delete the last admin user
|
|
67
|
-
const users =
|
|
63
|
+
const users = await userDao.findAll();
|
|
68
64
|
const adminUsers = users.filter((user) => user.isAdmin);
|
|
69
65
|
const userToDelete = users.find((user) => user.username === username);
|
|
70
66
|
if (userToDelete?.isAdmin && adminUsers.length === 1) {
|
|
71
67
|
return false; // Cannot delete the last admin
|
|
72
68
|
}
|
|
73
|
-
|
|
74
|
-
if (filteredUsers.length === users.length) {
|
|
75
|
-
return false; // User not found
|
|
76
|
-
}
|
|
77
|
-
// Save filtered users back to settings
|
|
78
|
-
const settings = loadSettings();
|
|
79
|
-
settings.users = filteredUsers;
|
|
80
|
-
return saveSettings(settings);
|
|
69
|
+
return await userDao.delete(username);
|
|
81
70
|
}
|
|
82
71
|
catch (error) {
|
|
83
72
|
console.error('Failed to delete user:', error);
|
|
@@ -85,16 +74,20 @@ export const deleteUser = (username) => {
|
|
|
85
74
|
}
|
|
86
75
|
};
|
|
87
76
|
// Check if user has admin permissions
|
|
88
|
-
export const isUserAdmin = (username) => {
|
|
89
|
-
const
|
|
77
|
+
export const isUserAdmin = async (username) => {
|
|
78
|
+
const userDao = getUserDao();
|
|
79
|
+
const user = await userDao.findByUsername(username);
|
|
90
80
|
return user?.isAdmin || false;
|
|
91
81
|
};
|
|
92
82
|
// Get user count
|
|
93
|
-
export const getUserCount = () => {
|
|
94
|
-
|
|
83
|
+
export const getUserCount = async () => {
|
|
84
|
+
const userDao = getUserDao();
|
|
85
|
+
return await userDao.count();
|
|
95
86
|
};
|
|
96
87
|
// Get admin count
|
|
97
|
-
export const getAdminCount = () => {
|
|
98
|
-
|
|
88
|
+
export const getAdminCount = async () => {
|
|
89
|
+
const userDao = getUserDao();
|
|
90
|
+
const admins = await userDao.findAdmins();
|
|
91
|
+
return admins.length;
|
|
99
92
|
};
|
|
100
93
|
//# sourceMappingURL=userService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userService.js","sourceRoot":"","sources":["../../src/services/userService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"userService.js","sourceRoot":"","sources":["../../src/services/userService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { loadOriginalSettings } from '../config/index.js';
|
|
2
|
+
import { initializeDatabase } from '../db/connection.js';
|
|
3
|
+
import { setDaoFactory } from '../dao/DaoFactory.js';
|
|
4
|
+
import { DatabaseDaoFactory } from '../dao/DatabaseDaoFactory.js';
|
|
5
|
+
import { UserRepository } from '../db/repositories/UserRepository.js';
|
|
6
|
+
import { ServerRepository } from '../db/repositories/ServerRepository.js';
|
|
7
|
+
import { GroupRepository } from '../db/repositories/GroupRepository.js';
|
|
8
|
+
import { SystemConfigRepository } from '../db/repositories/SystemConfigRepository.js';
|
|
9
|
+
import { UserConfigRepository } from '../db/repositories/UserConfigRepository.js';
|
|
10
|
+
/**
|
|
11
|
+
* Migrate from file-based configuration to database
|
|
12
|
+
*/
|
|
13
|
+
export async function migrateToDatabase() {
|
|
14
|
+
try {
|
|
15
|
+
console.log('Starting migration from file to database...');
|
|
16
|
+
// Initialize database connection
|
|
17
|
+
await initializeDatabase();
|
|
18
|
+
console.log('Database connection established');
|
|
19
|
+
// Load current settings from file
|
|
20
|
+
const settings = loadOriginalSettings();
|
|
21
|
+
console.log('Loaded settings from file');
|
|
22
|
+
// Create repositories
|
|
23
|
+
const userRepo = new UserRepository();
|
|
24
|
+
const serverRepo = new ServerRepository();
|
|
25
|
+
const groupRepo = new GroupRepository();
|
|
26
|
+
const systemConfigRepo = new SystemConfigRepository();
|
|
27
|
+
const userConfigRepo = new UserConfigRepository();
|
|
28
|
+
// Migrate users
|
|
29
|
+
if (settings.users && settings.users.length > 0) {
|
|
30
|
+
console.log(`Migrating ${settings.users.length} users...`);
|
|
31
|
+
for (const user of settings.users) {
|
|
32
|
+
const exists = await userRepo.exists(user.username);
|
|
33
|
+
if (!exists) {
|
|
34
|
+
await userRepo.create({
|
|
35
|
+
username: user.username,
|
|
36
|
+
password: user.password,
|
|
37
|
+
isAdmin: user.isAdmin || false,
|
|
38
|
+
});
|
|
39
|
+
console.log(` - Created user: ${user.username}`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.log(` - User already exists: ${user.username}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Migrate servers
|
|
47
|
+
if (settings.mcpServers) {
|
|
48
|
+
const serverNames = Object.keys(settings.mcpServers);
|
|
49
|
+
console.log(`Migrating ${serverNames.length} servers...`);
|
|
50
|
+
for (const [name, config] of Object.entries(settings.mcpServers)) {
|
|
51
|
+
const exists = await serverRepo.exists(name);
|
|
52
|
+
if (!exists) {
|
|
53
|
+
await serverRepo.create({
|
|
54
|
+
name,
|
|
55
|
+
type: config.type,
|
|
56
|
+
url: config.url,
|
|
57
|
+
command: config.command,
|
|
58
|
+
args: config.args,
|
|
59
|
+
env: config.env,
|
|
60
|
+
headers: config.headers,
|
|
61
|
+
enabled: config.enabled !== undefined ? config.enabled : true,
|
|
62
|
+
owner: config.owner,
|
|
63
|
+
enableKeepAlive: config.enableKeepAlive,
|
|
64
|
+
keepAliveInterval: config.keepAliveInterval,
|
|
65
|
+
tools: config.tools,
|
|
66
|
+
prompts: config.prompts,
|
|
67
|
+
options: config.options,
|
|
68
|
+
oauth: config.oauth,
|
|
69
|
+
});
|
|
70
|
+
console.log(` - Created server: ${name}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
console.log(` - Server already exists: ${name}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Migrate groups
|
|
78
|
+
if (settings.groups && settings.groups.length > 0) {
|
|
79
|
+
console.log(`Migrating ${settings.groups.length} groups...`);
|
|
80
|
+
for (const group of settings.groups) {
|
|
81
|
+
const exists = await groupRepo.existsByName(group.name);
|
|
82
|
+
if (!exists) {
|
|
83
|
+
await groupRepo.create({
|
|
84
|
+
name: group.name,
|
|
85
|
+
description: group.description,
|
|
86
|
+
servers: Array.isArray(group.servers) ? group.servers : [],
|
|
87
|
+
owner: group.owner,
|
|
88
|
+
});
|
|
89
|
+
console.log(` - Created group: ${group.name}`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.log(` - Group already exists: ${group.name}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Migrate system config
|
|
97
|
+
if (settings.systemConfig) {
|
|
98
|
+
console.log('Migrating system configuration...');
|
|
99
|
+
const systemConfig = {
|
|
100
|
+
routing: settings.systemConfig.routing || {},
|
|
101
|
+
install: settings.systemConfig.install || {},
|
|
102
|
+
smartRouting: settings.systemConfig.smartRouting || {},
|
|
103
|
+
mcpRouter: settings.systemConfig.mcpRouter || {},
|
|
104
|
+
nameSeparator: settings.systemConfig.nameSeparator,
|
|
105
|
+
oauth: settings.systemConfig.oauth || {},
|
|
106
|
+
oauthServer: settings.systemConfig.oauthServer || {},
|
|
107
|
+
enableSessionRebuild: settings.systemConfig.enableSessionRebuild,
|
|
108
|
+
};
|
|
109
|
+
await systemConfigRepo.update(systemConfig);
|
|
110
|
+
console.log(' - System configuration updated');
|
|
111
|
+
}
|
|
112
|
+
// Migrate user configs
|
|
113
|
+
if (settings.userConfigs) {
|
|
114
|
+
const usernames = Object.keys(settings.userConfigs);
|
|
115
|
+
console.log(`Migrating ${usernames.length} user configurations...`);
|
|
116
|
+
for (const [username, config] of Object.entries(settings.userConfigs)) {
|
|
117
|
+
const userConfig = {
|
|
118
|
+
routing: config.routing || {},
|
|
119
|
+
additionalConfig: config,
|
|
120
|
+
};
|
|
121
|
+
await userConfigRepo.update(username, userConfig);
|
|
122
|
+
console.log(` - Updated configuration for user: ${username}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
console.log('✅ Migration completed successfully');
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
console.error('❌ Migration failed:', error);
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Initialize database mode
|
|
135
|
+
* This function should be called during application startup when USE_DB=true
|
|
136
|
+
*/
|
|
137
|
+
export async function initializeDatabaseMode() {
|
|
138
|
+
try {
|
|
139
|
+
console.log('Initializing database mode...');
|
|
140
|
+
// Initialize database connection
|
|
141
|
+
await initializeDatabase();
|
|
142
|
+
console.log('Database connection established');
|
|
143
|
+
// Switch to database factory
|
|
144
|
+
setDaoFactory(DatabaseDaoFactory.getInstance());
|
|
145
|
+
console.log('Switched to database-backed DAO implementations');
|
|
146
|
+
// Check if migration is needed
|
|
147
|
+
const userRepo = new UserRepository();
|
|
148
|
+
const userCount = await userRepo.count();
|
|
149
|
+
if (userCount === 0) {
|
|
150
|
+
console.log('No users found in database, running migration...');
|
|
151
|
+
const migrated = await migrateToDatabase();
|
|
152
|
+
if (!migrated) {
|
|
153
|
+
throw new Error('Migration failed');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.log(`Database already contains ${userCount} users, skipping migration`);
|
|
158
|
+
}
|
|
159
|
+
console.log('✅ Database mode initialized successfully');
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
console.error('❌ Failed to initialize database mode:', error);
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* CLI tool for migration
|
|
169
|
+
*/
|
|
170
|
+
export async function runMigrationCli() {
|
|
171
|
+
console.log('MCPHub Configuration Migration Tool');
|
|
172
|
+
console.log('====================================\n');
|
|
173
|
+
const success = await migrateToDatabase();
|
|
174
|
+
if (success) {
|
|
175
|
+
console.log('\n✅ Migration completed successfully!');
|
|
176
|
+
console.log('You can now set USE_DB=true to use database-backed configuration');
|
|
177
|
+
process.exit(0);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.log('\n❌ Migration failed!');
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/utils/migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { findUserByUsername } from '../models/User.js';
|
|
|
4
4
|
/**
|
|
5
5
|
* Resolve an MCPHub user from a raw OAuth bearer token.
|
|
6
6
|
*/
|
|
7
|
-
export const resolveOAuthUserFromToken = (token) => {
|
|
7
|
+
export const resolveOAuthUserFromToken = async (token) => {
|
|
8
8
|
if (!token || !isOAuthServerEnabled()) {
|
|
9
9
|
return null;
|
|
10
10
|
}
|
|
@@ -12,7 +12,7 @@ export const resolveOAuthUserFromToken = (token) => {
|
|
|
12
12
|
if (!oauthToken || oauthToken.accessToken !== token) {
|
|
13
13
|
return null;
|
|
14
14
|
}
|
|
15
|
-
const dbUser = findUserByUsername(oauthToken.username);
|
|
15
|
+
const dbUser = await findUserByUsername(oauthToken.username);
|
|
16
16
|
return {
|
|
17
17
|
username: oauthToken.username,
|
|
18
18
|
password: '',
|
|
@@ -22,7 +22,7 @@ export const resolveOAuthUserFromToken = (token) => {
|
|
|
22
22
|
/**
|
|
23
23
|
* Resolve an MCPHub user from an Authorization header.
|
|
24
24
|
*/
|
|
25
|
-
export const resolveOAuthUserFromAuthHeader = (authHeader) => {
|
|
25
|
+
export const resolveOAuthUserFromAuthHeader = async (authHeader) => {
|
|
26
26
|
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauthBearer.js","sourceRoot":"","sources":["../../src/utils/oauthBearer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,
|
|
1
|
+
{"version":3,"file":"oauthBearer.js","sourceRoot":"","sources":["../../src/utils/oauthBearer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAAE,KAAc,EAAyB,EAAE;IACvF,IAAI,CAAC,KAAK,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE7D,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,KAAK;KAClC,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EACjD,UAAmB,EACI,EAAE;IACzB,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,yBAAyB,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC,CAAC"}
|