
- 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.
proto3 JSON serializer for TypeScript / JavaScript
This library implements proto3 JSON serialization and deserialization for protobuf.js protobuf objects according to the spec.
Note that the spec requires special representation of some google.protobuf.*
types
(Value
, Struct
, Timestamp
, Duration
, etc.), so you cannot just use .toObject()
since the result won't be understood by protobuf in other languages. Hence this module.
JavaScript:
const serializer = require('proto3-json-serializer');
TypeScript:
import * as serializer from 'proto3-json-serializer';
Serialization: protobuf.js object to proto3 JSON
const root = protobuf.loadSync('test.proto');
const Type = root.lookupType('test.Message');
const message = Type.fromObject({...});
const serialized = serializer.toProto3JSON(message);
Serialization works with any object created by calling .create()
, .decode()
, or .fromObject()
for a loaded protobuf type. It relies on the $type
field so it will not work with a static object.
Deserialization: proto3 JSON to protobuf.js object
To deserialize an object from proto3 JSON, we must know its type (as returned by root.lookupType('...')
).
Pass this type as the first parameter to .fromProto3JSON
:
const root = protobuf.loadSync('test.proto');
const Type = root.lookupType('test.Message');
const json = {...};
const deserialized = serializer.fromProto3JSON(Type, json);
Complete example
const assert = require('assert');
const path = require('path');
const protobuf = require('protobufjs');
const serializer = require('proto3-json-serializer');
// We'll take sample protos from google-proto-files but the code will work with any protos
const protos = require('google-proto-files');
// Load some proto file
const rpcProtos = protos.getProtoPath('rpc');
const root = protobuf.loadSync([
path.join(rpcProtos, 'status.proto'),
path.join(rpcProtos, 'error_details.proto'),
]);
const Status = root.lookupType('google.rpc.Status');
// If you have a protobuf object that follows proto3 JSON syntax
// https://developers.google.com/protocol-buffers/docs/proto3#json
// (this is an example of google.rpc.Status message in JSON)
const json = {
code: 3,
message: 'Test error message',
details: [
{
'@type': 'google.rpc.BadRequest',
fieldViolations: [
{
field: 'field',
description: 'must not be null',
},
],
},
],
};
// You can deserialize it into a protobuf.js object:
const deserialized = serializer.fromProto3JSON(Status, json);
console.log(deserialized);
// And serialize it back
const serialized = serializer.toProto3JSON(deserialized);
assert.deepStrictEqual(serialized, json);
Disclaimer
This is not an officially supported Google project.