
- Complete NestJS TypeScript implementation with WebSocket support - Direct messaging (DM) and group chat functionality - End-to-end encryption with AES encryption and key pairs - Media file support (images, videos, audio, documents) up to 100MB - Push notifications with Firebase Cloud Messaging integration - Mention alerts and real-time typing indicators - User authentication with JWT and Passport - SQLite database with TypeORM entities and relationships - Comprehensive API documentation with Swagger/OpenAPI - File upload handling with secure access control - Online/offline status tracking and presence management - Message editing, deletion, and reply functionality - Notification management with automatic cleanup - Health check endpoint for monitoring - CORS configuration for cross-origin requests - Environment-based configuration management - Structured for Flutter SDK integration Features implemented: ✅ Real-time messaging with Socket.IO ✅ User registration and authentication ✅ Direct messages and group chats ✅ Media file uploads and management ✅ End-to-end encryption ✅ Push notifications ✅ Mention alerts ✅ Typing indicators ✅ Message read receipts ✅ Online status tracking ✅ File access control ✅ Comprehensive API documentation Ready for Flutter SDK development and production deployment.
114 lines
2.4 KiB
JavaScript
114 lines
2.4 KiB
JavaScript
|
|
namespace('concurrent', function () {
|
|
task('A', function () {
|
|
console.log('Started A');
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
console.log('Finished A');
|
|
resolve();
|
|
}, 200);
|
|
});
|
|
});
|
|
|
|
task('B', function () {
|
|
console.log('Started B');
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
console.log('Finished B');
|
|
resolve();
|
|
}, 50);
|
|
});
|
|
});
|
|
|
|
task('C', function () {
|
|
console.log('Started C');
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
console.log('Finished C');
|
|
resolve();
|
|
}, 100);
|
|
});
|
|
});
|
|
|
|
task('D', function () {
|
|
console.log('Started D');
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
console.log('Finished D');
|
|
resolve();
|
|
}, 300);
|
|
});
|
|
});
|
|
|
|
task('Ba', ['A'], function () {
|
|
console.log('Started Ba');
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
console.log('Finished Ba');
|
|
resolve();
|
|
}, 50);
|
|
});
|
|
});
|
|
|
|
task('Afail', function () {
|
|
console.log('Started failing task');
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
console.log('Failing B with error');
|
|
throw new Error('I failed');
|
|
}, 50);
|
|
});
|
|
});
|
|
|
|
task('simple1', ['A','B'], {concurrency: 2}, function () {
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
resolve();
|
|
}, 50);
|
|
});
|
|
});
|
|
|
|
task('simple2', ['C','D'], {concurrency: 2}, function () {
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
resolve();
|
|
}, 50);
|
|
});
|
|
});
|
|
|
|
task('seqconcurrent', ['simple1','simple2'], function () {
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
resolve();
|
|
}, 50);
|
|
});
|
|
});
|
|
|
|
task('concurrentconcurrent', ['simple1','simple2'], {concurrency: 2}, function () {
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
resolve();
|
|
}, 50);
|
|
});
|
|
});
|
|
|
|
task('subdep', ['A','Ba'], {concurrency: 2}, function () {
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
resolve();
|
|
}, 50);
|
|
});
|
|
});
|
|
|
|
task('fail', ['A', 'B', 'Afail'], {concurrency: 3}, function () {
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
resolve();
|
|
}, 50);
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
|