
- 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.
98 lines
2.9 KiB
Markdown
98 lines
2.9 KiB
Markdown
# proto3 JSON serializer for TypeScript / JavaScript
|
|
|
|
This library implements proto3 JSON serialization and deserialization for
|
|
[protobuf.js](https://www.npmjs.com/package/protobufjs) protobuf objects
|
|
according to the [spec](https://developers.google.com/protocol-buffers/docs/proto3#json).
|
|
|
|
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:
|
|
|
|
```js
|
|
const serializer = require('proto3-json-serializer');
|
|
```
|
|
|
|
TypeScript:
|
|
|
|
```ts
|
|
import * as serializer from 'proto3-json-serializer';
|
|
```
|
|
|
|
## Serialization: protobuf.js object to proto3 JSON
|
|
|
|
```js
|
|
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`:
|
|
|
|
```js
|
|
const root = protobuf.loadSync('test.proto');
|
|
const Type = root.lookupType('test.Message');
|
|
const json = {...};
|
|
|
|
const deserialized = serializer.fromProto3JSON(Type, json);
|
|
```
|
|
|
|
## Complete example
|
|
```js
|
|
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.
|