
- 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.
63 lines
2.1 KiB
JavaScript
63 lines
2.1 KiB
JavaScript
"use strict";
|
|
var util = require("./util");
|
|
var schedule;
|
|
var noAsyncScheduler = function() {
|
|
throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
};
|
|
var NativePromise = util.getNativePromise();
|
|
if (util.isNode && typeof MutationObserver === "undefined") {
|
|
var GlobalSetImmediate = global.setImmediate;
|
|
var ProcessNextTick = process.nextTick;
|
|
schedule = util.isRecentNode
|
|
? function(fn) { GlobalSetImmediate.call(global, fn); }
|
|
: function(fn) { ProcessNextTick.call(process, fn); };
|
|
} else if (typeof NativePromise === "function" &&
|
|
typeof NativePromise.resolve === "function") {
|
|
var nativePromise = NativePromise.resolve();
|
|
schedule = function(fn) {
|
|
nativePromise.then(fn);
|
|
};
|
|
} else if ((typeof MutationObserver !== "undefined") &&
|
|
!(typeof window !== "undefined" &&
|
|
window.navigator &&
|
|
(window.navigator.standalone || window.cordova)) &&
|
|
("classList" in document.documentElement)) {
|
|
schedule = (function() {
|
|
var div = document.createElement("div");
|
|
var opts = {attributes: true};
|
|
var toggleScheduled = false;
|
|
var div2 = document.createElement("div");
|
|
var o2 = new MutationObserver(function() {
|
|
div.classList.toggle("foo");
|
|
toggleScheduled = false;
|
|
});
|
|
o2.observe(div2, opts);
|
|
|
|
var scheduleToggle = function() {
|
|
if (toggleScheduled) return;
|
|
toggleScheduled = true;
|
|
div2.classList.toggle("foo");
|
|
};
|
|
|
|
return function schedule(fn) {
|
|
var o = new MutationObserver(function() {
|
|
o.disconnect();
|
|
fn();
|
|
});
|
|
o.observe(div, opts);
|
|
scheduleToggle();
|
|
};
|
|
})();
|
|
} else if (typeof setImmediate !== "undefined") {
|
|
schedule = function (fn) {
|
|
setImmediate(fn);
|
|
};
|
|
} else if (typeof setTimeout !== "undefined") {
|
|
schedule = function (fn) {
|
|
setTimeout(fn, 0);
|
|
};
|
|
} else {
|
|
schedule = noAsyncScheduler;
|
|
}
|
|
module.exports = schedule;
|