@wabot-dev/framework 0.1.0-beta.45 → 0.1.0-beta.47
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/src/addon/async/pg/PgJobRepository.js +1 -1
- package/dist/src/addon/auth/api-key/@apiKeyGuard.js +17 -0
- package/dist/src/addon/auth/api-key/ApiKey.js +46 -0
- package/dist/src/addon/auth/api-key/ApiKeyGuardMiddleware.js +45 -0
- package/dist/src/addon/auth/api-key/ApiKeyRepository.js +13 -0
- package/dist/src/addon/auth/api-key/PgApiKeyRepository.js +21 -0
- package/dist/src/addon/auth/jwt/@jwtConnectionGuard.js +16 -0
- package/dist/src/addon/auth/jwt/JwtConnectionGuardMiddleware.js +57 -0
- package/dist/src/addon/auth/jwt/JwtRefreshTokenRepository.js +25 -0
- package/dist/src/addon/{rest-controller → auth}/jwt/JwtTokenDto.js +3 -3
- package/dist/src/addon/{rest-controller/jwt/JwtRefreshTokenRepository.js → auth/jwt/PgJwtRefreshTokenRepository.js} +6 -6
- package/dist/src/addon/chat-bot/pg/PgChatMemory.js +1 -1
- package/dist/src/addon/chat-bot/pg/PgChatRepository.js +1 -1
- package/dist/src/addon/chat-controller/whatsapp/{@whatsapp.js → @whatsApp.js} +3 -3
- package/dist/src/addon/chat-controller/whatsapp/PgWhatsAppRepository.js +1 -1
- package/dist/src/addon/chat-controller/whatsapp/WhatsAppReceiver.js +3 -49
- package/dist/src/addon/chat-controller/whatsapp/WhatsAppSender.js +7 -44
- package/dist/src/addon/chat-controller/whatsapp/cloud-api/WhatsAppReceiverByCloudApi.js +97 -0
- package/dist/src/addon/chat-controller/whatsapp/{WhatsAppSenderByCloudApi.js → cloud-api/WhatsAppSenderByCloudApi.js} +24 -16
- package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppProxyContracts.js +5 -0
- package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppReceiverByWabotProxy.js +65 -0
- package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppSenderByWabotProxy.js +60 -0
- package/dist/src/addon/chat-controller/whatsapp/proxy/WhatsAppWabotProxyConnection.js +45 -0
- package/dist/src/core/password/Password.js +30 -0
- package/dist/src/core/validation/metadata/@isArray.js +1 -1
- package/dist/src/core/validation/metadata/@isModel.js +1 -1
- package/dist/src/core/validation/metadata/@isOptional.js +1 -1
- package/dist/src/core/validation/metadata/ValidationMetadataStore.js +2 -2
- package/dist/src/core/validation/validate.js +1 -1
- package/dist/src/{addon/validation → core/validation/validators}/is-boolean/@isBoolean.js +2 -2
- package/dist/src/{addon/validation → core/validation/validators}/is-date/@isDate.js +2 -2
- package/dist/src/{addon/validation → core/validation/validators}/is-not-empty/@isNotEmpty.js +2 -2
- package/dist/src/{addon/validation → core/validation/validators}/is-number/@isNumber.js +2 -2
- package/dist/src/{addon/validation → core/validation/validators}/is-present/@isPresent.js +2 -2
- package/dist/src/{addon/validation → core/validation/validators}/is-string/@isString.js +2 -2
- package/dist/src/{addon/validation → core/validation/validators}/max/@max.js +2 -2
- package/dist/src/{addon/validation → core/validation/validators}/min/@min.js +2 -2
- package/dist/src/feature/chat-bot/ChatBot.js +4 -0
- package/dist/src/{addon → feature}/money/MoneyDto.js +2 -2
- package/dist/src/{addon/repository → feature}/pg/PgCrudRepository.js +1 -1
- package/dist/src/feature/socket-controller/metadata/@connectionMiddleware.js +16 -0
- package/dist/src/feature/socket-controller/metadata/@socketConnection.js +18 -0
- package/dist/src/feature/socket-controller/metadata/@socketController.js +15 -0
- package/dist/src/feature/socket-controller/metadata/@socketEvent.js +18 -0
- package/dist/src/feature/socket-controller/metadata/SocketControllerMetadataStore.js +65 -0
- package/dist/src/feature/socket-controller/runSocketControllers.js +98 -0
- package/dist/src/index.d.ts +546 -368
- package/dist/src/index.js +53 -36
- package/package.json +1 -1
- package/dist/src/addon/chat-controller/whatsapp/WabotDevConnection.js +0 -57
- package/dist/src/addon/chat-controller/whatsapp/WabotDevSocketContracts.js +0 -10
- package/dist/src/addon/chat-controller/whatsapp/WhatsAppReceiverByDevConnection.js +0 -26
- package/dist/src/addon/chat-controller/whatsapp/WhatsAppReceiverByWebHook.js +0 -57
- package/dist/src/addon/chat-controller/whatsapp/WhatsAppSenderByDevConnection.js +0 -60
- package/dist/src/addon/{rest-controller → auth}/jwt/@jwtGuard.js +0 -0
- package/dist/src/addon/{rest-controller → auth}/jwt/Jwt.js +0 -0
- package/dist/src/addon/{rest-controller → auth}/jwt/JwtAccessAndRefreshTokenDto.js +0 -0
- package/dist/src/addon/{rest-controller → auth}/jwt/JwtConfig.js +0 -0
- package/dist/src/addon/{rest-controller → auth}/jwt/JwtGuardMiddleware.js +1 -1
- /package/dist/src/addon/{rest-controller → auth}/jwt/JwtRefreshToken.js +0 -0
- /package/dist/src/addon/{rest-controller → auth}/jwt/JwtSigner.js +0 -0
- /package/dist/src/core/validation/{validators → core}/validateArray.js +0 -0
- /package/dist/src/core/validation/{validators → core}/validateIsOptional.js +0 -0
- /package/dist/src/core/validation/{validators → core}/validateModel.js +0 -0
- /package/dist/src/{addon/validation → core/validation/validators}/is-boolean/validateIsBoolean.js +0 -0
- /package/dist/src/{addon/validation → core/validation/validators}/is-date/validateIsDate.js +0 -0
- /package/dist/src/{addon/validation → core/validation/validators}/is-not-empty/validateIsNotEmpty.js +0 -0
- /package/dist/src/{addon/validation → core/validation/validators}/is-number/validateIsNumber.js +0 -0
- /package/dist/src/{addon/validation → core/validation/validators}/is-present/validateIsPresent.js +0 -0
- /package/dist/src/{addon/validation → core/validation/validators}/is-string/validateIsString.js +0 -0
- /package/dist/src/{addon/validation → core/validation/validators}/max/validateMax.js +0 -0
- /package/dist/src/{addon/validation → core/validation/validators}/min/validateMin.js +0 -0
- /package/dist/src/{addon/repository → feature}/pg/PgRepositoryBase.js +0 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const WHATSAPP_PROXY_SEND_MESSAGE_EVENT = 'sendMessage';
|
|
2
|
+
const WHATSAPP_PROXY_LISTEN_MESSAGE_EVENT = 'listenMessage';
|
|
3
|
+
const WHATSAPP_MESSAGE_EVENT = 'message';
|
|
4
|
+
|
|
5
|
+
export { WHATSAPP_MESSAGE_EVENT, WHATSAPP_PROXY_LISTEN_MESSAGE_EVENT, WHATSAPP_PROXY_SEND_MESSAGE_EVENT };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { __decorate, __metadata } from 'tslib';
|
|
2
|
+
import { WhatsAppReceiver } from '../WhatsAppReceiver.js';
|
|
3
|
+
import { injectable } from '../../../../core/injection/index.js';
|
|
4
|
+
import { Logger } from '../../../../core/logger/Logger.js';
|
|
5
|
+
import { WHATSAPP_MESSAGE_EVENT } from './WhatsAppProxyContracts.js';
|
|
6
|
+
import { WhatsAppWabotProxyConnection } from './WhatsAppWabotProxyConnection.js';
|
|
7
|
+
|
|
8
|
+
let WhatsAppReceiverByWabotProxy = class WhatsAppReceiverByWabotProxy extends WhatsAppReceiver {
|
|
9
|
+
connection;
|
|
10
|
+
loger = new Logger('wabot:whats-app-receiver-by-wabot-proxy');
|
|
11
|
+
constructor(connection) {
|
|
12
|
+
super();
|
|
13
|
+
this.connection = connection;
|
|
14
|
+
}
|
|
15
|
+
async connect() {
|
|
16
|
+
// Nothing
|
|
17
|
+
}
|
|
18
|
+
listenMessage(request) {
|
|
19
|
+
this.connection.getSocket().then(async (socket) => {
|
|
20
|
+
const req = {
|
|
21
|
+
event: 'listenMessage',
|
|
22
|
+
data: {
|
|
23
|
+
to: [request.to],
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const response = await socket.emitWithAck(req.event, req.data);
|
|
27
|
+
if (response && typeof response == 'object' && response['error']) {
|
|
28
|
+
this.loger.error(response.error);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
else if (!response ||
|
|
32
|
+
typeof response !== 'object' ||
|
|
33
|
+
!Array.isArray(response.from) ||
|
|
34
|
+
!Array.isArray(response.to)) {
|
|
35
|
+
this.loger.error('unknown response');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this.loger.trace(`succes add whats-app proxy listener for messages from [${response.from.join(',')}] to [${response.to.join(',')}]`);
|
|
39
|
+
socket.on(WHATSAPP_MESSAGE_EVENT, (data, callback) => {
|
|
40
|
+
if (data.to !== request.to) {
|
|
41
|
+
throw new Error(`expecting message to '${request.to}' but received to='${data.to}'`);
|
|
42
|
+
}
|
|
43
|
+
callback({ success: true });
|
|
44
|
+
this.loger.trace(`success receive message from '${data.from}' to '${data.to}'`);
|
|
45
|
+
request.listener({
|
|
46
|
+
chatConnection: {
|
|
47
|
+
channelName: 'WhatsAppChannel',
|
|
48
|
+
id: data.from,
|
|
49
|
+
},
|
|
50
|
+
message: {
|
|
51
|
+
text: data.content.text,
|
|
52
|
+
senderName: data.senderName,
|
|
53
|
+
senderId: data.from,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
WhatsAppReceiverByWabotProxy = __decorate([
|
|
61
|
+
injectable(),
|
|
62
|
+
__metadata("design:paramtypes", [WhatsAppWabotProxyConnection])
|
|
63
|
+
], WhatsAppReceiverByWabotProxy);
|
|
64
|
+
|
|
65
|
+
export { WhatsAppReceiverByWabotProxy };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { __decorate, __metadata } from 'tslib';
|
|
2
|
+
import { WhatsAppSender } from '../WhatsAppSender.js';
|
|
3
|
+
import { singleton } from '../../../../core/injection/index.js';
|
|
4
|
+
import { Logger } from '../../../../core/logger/Logger.js';
|
|
5
|
+
import '../../../../feature/chat-bot/ChatBot.js';
|
|
6
|
+
import { ChatRepository } from '../../../../feature/chat-bot/ChatRepository.js';
|
|
7
|
+
import 'uuid';
|
|
8
|
+
import '../../../../feature/chat-bot/metadata/ChatBotMetadataStore.js';
|
|
9
|
+
import '../../../../feature/chat-controller/metadata/ControllerMetadataStore.js';
|
|
10
|
+
import { ChatResolver } from '../../../../feature/chat-controller/ChatResolver.js';
|
|
11
|
+
import 'reflect-metadata';
|
|
12
|
+
import '../../../../feature/mindset/metadata/MindsetMetadataStore.js';
|
|
13
|
+
import '../../../../feature/mindset/MindsetOperator.js';
|
|
14
|
+
import { WhatsAppRepository } from '../WhatsAppRepository.js';
|
|
15
|
+
import { WhatsAppWabotProxyConnection } from './WhatsAppWabotProxyConnection.js';
|
|
16
|
+
|
|
17
|
+
let WhatsAppSenderByWabotProxy = class WhatsAppSenderByWabotProxy extends WhatsAppSender {
|
|
18
|
+
wabotDevConnection;
|
|
19
|
+
logger = new Logger('wabot:whatsapp-sender-by-wabot-proxy');
|
|
20
|
+
constructor(wabotDevConnection, chatRepository, chatResolver, whatsAppRepository) {
|
|
21
|
+
super(chatRepository, chatResolver, whatsAppRepository);
|
|
22
|
+
this.wabotDevConnection = wabotDevConnection;
|
|
23
|
+
}
|
|
24
|
+
async sendWhatsApp(request, options) {
|
|
25
|
+
try {
|
|
26
|
+
const socket = await this.wabotDevConnection.getSocket();
|
|
27
|
+
const req = {
|
|
28
|
+
event: 'sendMessage',
|
|
29
|
+
data: {
|
|
30
|
+
from: request.from,
|
|
31
|
+
to: request.to,
|
|
32
|
+
content: {
|
|
33
|
+
text: request.message.text ?? 'No Text',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
const ack = await socket.timeout(5000).emitWithAck(req.event, req.data);
|
|
38
|
+
if (!ack || !ack.success) {
|
|
39
|
+
throw new Error(`not success ack, when send whatsapp from '${request.from}' to '${request.to}'`);
|
|
40
|
+
}
|
|
41
|
+
this.logger.trace(`success send whatsapp from '${request.from}' to '${request.to}'`);
|
|
42
|
+
if (options?.writeChatMemory) {
|
|
43
|
+
await this.writePrivateChatMemory(request.message, request.to);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
this.logger.error(err);
|
|
48
|
+
throw new Error(undefined, { cause: err });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
WhatsAppSenderByWabotProxy = __decorate([
|
|
53
|
+
singleton(),
|
|
54
|
+
__metadata("design:paramtypes", [WhatsAppWabotProxyConnection,
|
|
55
|
+
ChatRepository,
|
|
56
|
+
ChatResolver,
|
|
57
|
+
WhatsAppRepository])
|
|
58
|
+
], WhatsAppSenderByWabotProxy);
|
|
59
|
+
|
|
60
|
+
export { WhatsAppSenderByWabotProxy };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { __decorate, __metadata } from 'tslib';
|
|
2
|
+
import { Env } from '../../../../core/env/Env.js';
|
|
3
|
+
import { injectable } from '../../../../core/injection/index.js';
|
|
4
|
+
import { Logger } from '../../../../core/logger/Logger.js';
|
|
5
|
+
import { io } from 'socket.io-client';
|
|
6
|
+
|
|
7
|
+
let WhatsAppWabotProxyConnection = class WhatsAppWabotProxyConnection {
|
|
8
|
+
baseUrl;
|
|
9
|
+
socket = null;
|
|
10
|
+
apiKey;
|
|
11
|
+
logger = new Logger('wabot:whats-app-wabot-proxy-connection');
|
|
12
|
+
constructor(env) {
|
|
13
|
+
this.apiKey = env.requireString('WABOT_API_KEY');
|
|
14
|
+
this.baseUrl = env.requireString('WABOT_PROXY_URL');
|
|
15
|
+
while (this.baseUrl.endsWith('/')) {
|
|
16
|
+
this.baseUrl = this.baseUrl.substring(0, this.baseUrl.length - 1);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async getSocket() {
|
|
20
|
+
if (this.socket) {
|
|
21
|
+
return this.socket;
|
|
22
|
+
}
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const socket = io(`${this.baseUrl}/whats-app`, {
|
|
25
|
+
autoConnect: false,
|
|
26
|
+
auth: { token: this.apiKey },
|
|
27
|
+
reconnection: true,
|
|
28
|
+
});
|
|
29
|
+
socket.on('connect', async () => {
|
|
30
|
+
this.socket = socket;
|
|
31
|
+
resolve(socket);
|
|
32
|
+
});
|
|
33
|
+
socket.on('connect_error', (err) => {
|
|
34
|
+
reject(new Error(err && err.message ? err.message : 'connection error', { cause: err }));
|
|
35
|
+
});
|
|
36
|
+
socket.connect();
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
WhatsAppWabotProxyConnection = __decorate([
|
|
41
|
+
injectable(),
|
|
42
|
+
__metadata("design:paramtypes", [Env])
|
|
43
|
+
], WhatsAppWabotProxyConnection);
|
|
44
|
+
|
|
45
|
+
export { WhatsAppWabotProxyConnection };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { randomBytes, scryptSync, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { Random } from '../random/Random.js';
|
|
3
|
+
|
|
4
|
+
class Password {
|
|
5
|
+
static hash(options) {
|
|
6
|
+
const { password: secret, saltLength = 16, keyLength = 64 } = options;
|
|
7
|
+
const salt = randomBytes(saltLength).toString('hex');
|
|
8
|
+
const derivedKey = scryptSync(secret, salt, keyLength);
|
|
9
|
+
return `${salt}:${derivedKey.toString('hex')}`;
|
|
10
|
+
}
|
|
11
|
+
static isValid(req) {
|
|
12
|
+
const [salt, storedKeyHex] = req.hash.split(':');
|
|
13
|
+
if (!salt || !storedKeyHex)
|
|
14
|
+
return false;
|
|
15
|
+
try {
|
|
16
|
+
const keyLength = Buffer.from(storedKeyHex, 'hex').length;
|
|
17
|
+
const derivedKey = scryptSync(req.password, salt, keyLength);
|
|
18
|
+
const storedKey = Buffer.from(storedKeyHex, 'hex');
|
|
19
|
+
return timingSafeEqual(derivedKey, storedKey);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
static generate(length) {
|
|
26
|
+
return Random.string(length);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { Password };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { container } from '../../injection/index.js';
|
|
2
|
-
import { validateArray } from '../
|
|
2
|
+
import { validateArray } from '../core/validateArray.js';
|
|
3
3
|
import { ValidationMetadataStore } from './ValidationMetadataStore.js';
|
|
4
4
|
|
|
5
5
|
function isArray(options) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { container } from '../../injection/index.js';
|
|
2
|
-
import { validateModel } from '../
|
|
2
|
+
import { validateModel } from '../core/validateModel.js';
|
|
3
3
|
import { ValidationMetadataStore } from './ValidationMetadataStore.js';
|
|
4
4
|
|
|
5
5
|
function isModel(model) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { container } from '../../injection/index.js';
|
|
2
2
|
import { ValidationMetadataStore } from './ValidationMetadataStore.js';
|
|
3
|
-
import { _IS_OPTIONAL_DUMMY_VALIDATOR_ } from '../
|
|
3
|
+
import { _IS_OPTIONAL_DUMMY_VALIDATOR_ } from '../core/validateIsOptional.js';
|
|
4
4
|
|
|
5
5
|
function isOptional() {
|
|
6
6
|
return function (target, propertyKey) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
2
|
import { singleton } from '../../injection/index.js';
|
|
3
|
-
import { _IS_OPTIONAL_DUMMY_VALIDATOR_ } from '../
|
|
4
|
-
import { validateArray } from '../
|
|
3
|
+
import { _IS_OPTIONAL_DUMMY_VALIDATOR_ } from '../core/validateIsOptional.js';
|
|
4
|
+
import { validateArray } from '../core/validateArray.js';
|
|
5
5
|
|
|
6
6
|
function getClassHierarchy(cls) {
|
|
7
7
|
const classes = [];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { container } from '../injection/index.js';
|
|
2
2
|
import { ValidationMetadataStore } from './metadata/ValidationMetadataStore.js';
|
|
3
|
-
import { validateModel } from './
|
|
3
|
+
import { validateModel } from './core/validateModel.js';
|
|
4
4
|
|
|
5
5
|
function validate(value, modelConstructor) {
|
|
6
6
|
const metadataStore = container.resolve(ValidationMetadataStore);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { container } from '../../../
|
|
2
|
-
import { ValidationMetadataStore } from '
|
|
1
|
+
import { container } from '../../../injection/index.js';
|
|
2
|
+
import { ValidationMetadataStore } from '../../metadata/ValidationMetadataStore.js';
|
|
3
3
|
import { validateIsBoolean } from './validateIsBoolean.js';
|
|
4
4
|
|
|
5
5
|
function isBoolean() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { container } from '../../../
|
|
1
|
+
import { container } from '../../../injection/index.js';
|
|
2
2
|
import { validateIsDate } from './validateIsDate.js';
|
|
3
|
-
import { ValidationMetadataStore } from '
|
|
3
|
+
import { ValidationMetadataStore } from '../../metadata/ValidationMetadataStore.js';
|
|
4
4
|
|
|
5
5
|
function isDate() {
|
|
6
6
|
return function (target, propertyKey) {
|
package/dist/src/{addon/validation → core/validation/validators}/is-not-empty/@isNotEmpty.js
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { container } from '../../../
|
|
2
|
-
import { ValidationMetadataStore } from '
|
|
1
|
+
import { container } from '../../../injection/index.js';
|
|
2
|
+
import { ValidationMetadataStore } from '../../metadata/ValidationMetadataStore.js';
|
|
3
3
|
import { validateIsNotEmpty } from './validateIsNotEmpty.js';
|
|
4
4
|
|
|
5
5
|
function isNotEmpty() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { container } from '../../../
|
|
1
|
+
import { container } from '../../../injection/index.js';
|
|
2
2
|
import { validateIsNumber } from './validateIsNumber.js';
|
|
3
|
-
import { ValidationMetadataStore } from '
|
|
3
|
+
import { ValidationMetadataStore } from '../../metadata/ValidationMetadataStore.js';
|
|
4
4
|
|
|
5
5
|
function isNumber() {
|
|
6
6
|
return function (target, propertyKey) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { container } from '../../../
|
|
2
|
-
import { ValidationMetadataStore } from '
|
|
1
|
+
import { container } from '../../../injection/index.js';
|
|
2
|
+
import { ValidationMetadataStore } from '../../metadata/ValidationMetadataStore.js';
|
|
3
3
|
import { validateIsPresent } from './validateIsPresent.js';
|
|
4
4
|
|
|
5
5
|
function isPresent() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { container } from '../../../
|
|
2
|
-
import { ValidationMetadataStore } from '
|
|
1
|
+
import { container } from '../../../injection/index.js';
|
|
2
|
+
import { ValidationMetadataStore } from '../../metadata/ValidationMetadataStore.js';
|
|
3
3
|
import { validateIsString } from './validateIsString.js';
|
|
4
4
|
|
|
5
5
|
function isString() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { container } from '../../../
|
|
2
|
-
import { ValidationMetadataStore } from '
|
|
1
|
+
import { container } from '../../../injection/index.js';
|
|
2
|
+
import { ValidationMetadataStore } from '../../metadata/ValidationMetadataStore.js';
|
|
3
3
|
import { validateMax } from './validateMax.js';
|
|
4
4
|
|
|
5
5
|
function max(limit) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { container } from '../../../
|
|
2
|
-
import { ValidationMetadataStore } from '
|
|
1
|
+
import { container } from '../../../injection/index.js';
|
|
2
|
+
import { ValidationMetadataStore } from '../../metadata/ValidationMetadataStore.js';
|
|
3
3
|
import { validateMin } from './validateMin.js';
|
|
4
4
|
|
|
5
5
|
function min(limit) {
|
|
@@ -35,6 +35,7 @@ let ChatBot = class ChatBot {
|
|
|
35
35
|
}
|
|
36
36
|
const systemPrompt = await this.mindset.systemPrompt();
|
|
37
37
|
const tools = this.mindset.tools();
|
|
38
|
+
const identity = await this.mindset.identity();
|
|
38
39
|
const llms = await this.mindset.llms();
|
|
39
40
|
if (llms.length === 0) {
|
|
40
41
|
throw new Error(`Invalid ${this.mindset.constructor.name} - llms not found`);
|
|
@@ -50,6 +51,9 @@ let ChatBot = class ChatBot {
|
|
|
50
51
|
if (newItemData.type === 'functionCall') {
|
|
51
52
|
newItemData.functionCall.result = await this.mindset.callFunction(newItemData.functionCall.name, newItemData.functionCall.arguments ?? '{}');
|
|
52
53
|
}
|
|
54
|
+
else if (newItemData.type === 'botMessage') {
|
|
55
|
+
newItemData.botMessage.senderName = identity.name;
|
|
56
|
+
}
|
|
53
57
|
const newChatItem = new ChatItem(newItemData);
|
|
54
58
|
await this.memory.create(newChatItem);
|
|
55
59
|
if (newChatItem.type === 'botMessage') {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __decorate, __metadata } from 'tslib';
|
|
2
2
|
import '../../core/injection/index.js';
|
|
3
3
|
import '../../core/validation/metadata/ValidationMetadataStore.js';
|
|
4
|
-
import { isNotEmpty } from '
|
|
5
|
-
import { isString } from '
|
|
4
|
+
import { isNotEmpty } from '../../core/validation/validators/is-not-empty/@isNotEmpty.js';
|
|
5
|
+
import { isString } from '../../core/validation/validators/is-string/@isString.js';
|
|
6
6
|
|
|
7
7
|
class MoneyDto {
|
|
8
8
|
amount = '';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as shortUUID from 'short-uuid';
|
|
2
2
|
import { PgRepositoryBase } from './PgRepositoryBase.js';
|
|
3
|
-
import { CustomError } from '
|
|
3
|
+
import { CustomError } from '../../core/error/CustomError.js';
|
|
4
4
|
|
|
5
5
|
class PgCrudRepository extends PgRepositoryBase {
|
|
6
6
|
config;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
|
|
2
|
+
import { container } from '../../../core/injection/index.js';
|
|
3
|
+
|
|
4
|
+
function connectionMiddleware(middlewareConstructor) {
|
|
5
|
+
return function (target, propertyKey) {
|
|
6
|
+
const functionName = propertyKey.toString();
|
|
7
|
+
const store = container.resolve(SocketControllerMetadataStore);
|
|
8
|
+
store.saveConnectionMiddlewareMetadata({
|
|
9
|
+
controllerConstructor: target.constructor,
|
|
10
|
+
functionName,
|
|
11
|
+
middlewareConstructor: middlewareConstructor,
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { connectionMiddleware };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { container } from '../../../core/injection/index.js';
|
|
2
|
+
import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
|
|
3
|
+
|
|
4
|
+
function socketConnection(config) {
|
|
5
|
+
return function (target, propertyKey) {
|
|
6
|
+
const functionName = propertyKey.toString();
|
|
7
|
+
const paramsTypes = Reflect.getMetadata('design:paramtypes', target, functionName);
|
|
8
|
+
const store = container.resolve(SocketControllerMetadataStore);
|
|
9
|
+
store.saveSocketConnectionMetadata({
|
|
10
|
+
controllerConstructor: target.constructor,
|
|
11
|
+
config: typeof config === 'string' ? { namespace: config } : config,
|
|
12
|
+
functionName,
|
|
13
|
+
paramsTypes,
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { socketConnection };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
|
|
2
|
+
import { container, injectable } from '../../../core/injection/index.js';
|
|
3
|
+
|
|
4
|
+
function socketController(config) {
|
|
5
|
+
return function (target) {
|
|
6
|
+
const metaDataStore = container.resolve(SocketControllerMetadataStore);
|
|
7
|
+
metaDataStore.saveControllerMetadata({
|
|
8
|
+
controllerConstructor: target,
|
|
9
|
+
config: typeof config === 'string' ? { namespace: config } : config,
|
|
10
|
+
});
|
|
11
|
+
injectable()(target);
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { socketController };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { container } from '../../../core/injection/index.js';
|
|
2
|
+
import { SocketControllerMetadataStore } from './SocketControllerMetadataStore.js';
|
|
3
|
+
|
|
4
|
+
function socketEvent(config) {
|
|
5
|
+
return function (target, propertyKey) {
|
|
6
|
+
const functionName = propertyKey.toString();
|
|
7
|
+
const paramsTypes = Reflect.getMetadata('design:paramtypes', target, functionName);
|
|
8
|
+
const store = container.resolve(SocketControllerMetadataStore);
|
|
9
|
+
store.saveSocketEventMetadata({
|
|
10
|
+
controllerConstructor: target.constructor,
|
|
11
|
+
config: typeof config === 'string' ? { event: config } : config,
|
|
12
|
+
functionName,
|
|
13
|
+
paramsTypes,
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { socketEvent };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { __decorate } from 'tslib';
|
|
2
|
+
import { singleton } from '../../../core/injection/index.js';
|
|
3
|
+
|
|
4
|
+
let SocketControllerMetadataStore = class SocketControllerMetadataStore {
|
|
5
|
+
socketControllers = new Map();
|
|
6
|
+
socketConnections = new Map();
|
|
7
|
+
socketEvents = new Map();
|
|
8
|
+
connectionMiddlewares = new Map();
|
|
9
|
+
saveControllerMetadata(controllerMetadata) {
|
|
10
|
+
this.socketControllers.set(controllerMetadata.controllerConstructor, controllerMetadata);
|
|
11
|
+
}
|
|
12
|
+
saveSocketConnectionMetadata(socketConnectionMetadata) {
|
|
13
|
+
let controllerConnections = this.socketConnections.get(socketConnectionMetadata.controllerConstructor);
|
|
14
|
+
if (!controllerConnections) {
|
|
15
|
+
this.socketConnections.set(socketConnectionMetadata.controllerConstructor, (controllerConnections = new Map()));
|
|
16
|
+
}
|
|
17
|
+
controllerConnections.set(socketConnectionMetadata.functionName, socketConnectionMetadata);
|
|
18
|
+
}
|
|
19
|
+
saveSocketEventMetadata(socketEventMetadata) {
|
|
20
|
+
let controllerEvents = this.socketEvents.get(socketEventMetadata.controllerConstructor);
|
|
21
|
+
if (!controllerEvents) {
|
|
22
|
+
this.socketEvents.set(socketEventMetadata.controllerConstructor, (controllerEvents = new Map()));
|
|
23
|
+
}
|
|
24
|
+
controllerEvents.set(socketEventMetadata.functionName, socketEventMetadata);
|
|
25
|
+
}
|
|
26
|
+
saveConnectionMiddlewareMetadata(middlewareMetadata) {
|
|
27
|
+
let controllerMiddlewares = this.connectionMiddlewares.get(middlewareMetadata.controllerConstructor);
|
|
28
|
+
if (!controllerMiddlewares) {
|
|
29
|
+
this.connectionMiddlewares.set(middlewareMetadata.controllerConstructor, (controllerMiddlewares = new Map()));
|
|
30
|
+
}
|
|
31
|
+
let methodMiddlewares = controllerMiddlewares.get(middlewareMetadata.functionName);
|
|
32
|
+
if (!methodMiddlewares) {
|
|
33
|
+
controllerMiddlewares.set(middlewareMetadata.functionName, (methodMiddlewares = []));
|
|
34
|
+
}
|
|
35
|
+
methodMiddlewares.unshift(middlewareMetadata);
|
|
36
|
+
}
|
|
37
|
+
getControllerSockerConnectionsInfo(controllerConstructor) {
|
|
38
|
+
const controller = this.socketControllers.get(controllerConstructor);
|
|
39
|
+
if (!controller) {
|
|
40
|
+
throw new Error(`${controllerConstructor.name} should be decorated with @socketController`);
|
|
41
|
+
}
|
|
42
|
+
const connections = this.socketConnections.get(controllerConstructor);
|
|
43
|
+
const events = this.socketEvents.get(controllerConstructor) ?? new Map();
|
|
44
|
+
if (!connections?.size) {
|
|
45
|
+
// TODO: Warning
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
return [...connections.values()].map((connection) => ({
|
|
49
|
+
...connection,
|
|
50
|
+
events: (() => {
|
|
51
|
+
const connectionNamespace = connection.config?.namespace;
|
|
52
|
+
return [...events.values()].filter((x) => x.config?.namespace === connectionNamespace);
|
|
53
|
+
})(),
|
|
54
|
+
connectionMiddlewares: this.connectionMiddlewares
|
|
55
|
+
.get(connection.controllerConstructor)
|
|
56
|
+
?.get(connection.functionName) ?? [],
|
|
57
|
+
controller: this.socketControllers.get(connection.controllerConstructor),
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
SocketControllerMetadataStore = __decorate([
|
|
62
|
+
singleton()
|
|
63
|
+
], SocketControllerMetadataStore);
|
|
64
|
+
|
|
65
|
+
export { SocketControllerMetadataStore };
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { SocketControllerMetadataStore } from './metadata/SocketControllerMetadataStore.js';
|
|
2
|
+
import { container } from '../../core/injection/index.js';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { Logger } from '../../core/logger/Logger.js';
|
|
5
|
+
import { SocketServerProvider } from '../socket/SocketServerProvider.js';
|
|
6
|
+
import { CustomError } from '../../core/error/CustomError.js';
|
|
7
|
+
import '../../core/validation/metadata/ValidationMetadataStore.js';
|
|
8
|
+
import { validate } from '../../core/validation/validate.js';
|
|
9
|
+
|
|
10
|
+
function runSocketControllers(controllers) {
|
|
11
|
+
const logger = new Logger('wabot:socket');
|
|
12
|
+
const metadataStore = container.resolve(SocketControllerMetadataStore);
|
|
13
|
+
const socketServerProvider = container.resolve(SocketServerProvider);
|
|
14
|
+
const socketServer = socketServerProvider.getSocketServer();
|
|
15
|
+
controllers.forEach((controller) => {
|
|
16
|
+
const connections = metadataStore.getControllerSockerConnectionsInfo(controller);
|
|
17
|
+
connections.forEach((connection) => {
|
|
18
|
+
const namespace = path
|
|
19
|
+
.join(connection.controller.config?.namespace ?? '/', connection.config?.namespace ?? '')
|
|
20
|
+
.replaceAll('\\', '/');
|
|
21
|
+
logger.info(`config connection to ${namespace}`);
|
|
22
|
+
const namespaceServer = socketServer.of(namespace);
|
|
23
|
+
namespaceServer.use(async (socket, next) => {
|
|
24
|
+
const connectionContainer = container.createChildContainer();
|
|
25
|
+
try {
|
|
26
|
+
const middlewares = connection.connectionMiddlewares.map((x) => connectionContainer.resolve(x.middlewareConstructor));
|
|
27
|
+
for (const middleware of middlewares) {
|
|
28
|
+
await middleware.handle(socket, connectionContainer);
|
|
29
|
+
}
|
|
30
|
+
socket.data.connectionContainer = connectionContainer;
|
|
31
|
+
next();
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
next(err);
|
|
35
|
+
connectionContainer.dispose();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
namespaceServer.on('connection', async (socket) => {
|
|
39
|
+
logger.trace(`connection on '${namespace}'`);
|
|
40
|
+
const connectionContainer = socket.data.connectionContainer;
|
|
41
|
+
try {
|
|
42
|
+
const controllerInstance = connectionContainer.resolve(connection.controllerConstructor);
|
|
43
|
+
connection.events.forEach((event) => {
|
|
44
|
+
logger.trace(`config listener to '${event.config.event}' event on '${namespace}'`);
|
|
45
|
+
socket.on(event.config.event, async (req, callback) => {
|
|
46
|
+
logger.trace(`received '${event.config.event}' event on '${namespace}'`);
|
|
47
|
+
try {
|
|
48
|
+
const reqType = event.paramsTypes[0];
|
|
49
|
+
if (typeof reqType !== 'function') {
|
|
50
|
+
throw new CustomError({
|
|
51
|
+
httpCode: 400,
|
|
52
|
+
message: 'Unable to validate request',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const { value, error } = validate(req, reqType);
|
|
56
|
+
if (error) {
|
|
57
|
+
throw new CustomError({
|
|
58
|
+
httpCode: 400,
|
|
59
|
+
message: error.description,
|
|
60
|
+
info: error,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const out = await controllerInstance[event.functionName].apply(controllerInstance, [value, socket]);
|
|
64
|
+
callback(out);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (err instanceof Error) {
|
|
68
|
+
const keys = Object.keys(err).filter((key) => !['message', 'stack'].includes(key));
|
|
69
|
+
const { httpCode, ...info } = keys.reduce((acc, key) => {
|
|
70
|
+
acc[key] = err[key];
|
|
71
|
+
return acc;
|
|
72
|
+
}, {});
|
|
73
|
+
if (typeof callback === 'function') {
|
|
74
|
+
callback({ error: { ...info, message: err.message, stack: err.stack } });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
if (typeof callback === 'function') {
|
|
79
|
+
callback({ error: { message: 'Unspected error' } });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
await controllerInstance[connection.functionName].apply(controllerInstance, [socket]);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
logger.error(err);
|
|
89
|
+
socket.disconnect();
|
|
90
|
+
connectionContainer.dispose();
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
socketServerProvider.listen();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export { runSocketControllers };
|