Automated Action 545563e776 Implement comprehensive real-time chat API with NestJS
- 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.
2025-06-21 17:13:05 +00:00

186 lines
7.3 KiB
Markdown

# Salty
Salty is a drop-in replacement for (some of) [TaffyDB](https://github.com/typicaljoe/taffydb). It
supports only the TaffyDB features that JSDoc has historically used.
## Why Salty?
TaffyDB lets you query an array of objects, similar to the way you would query a database. JSDoc 3.x
used TaffyDB to manage _doclets_, or objects that contain information about your code.
Specifically, after JSDoc parsed your code, it passed the doclets to your JSDoc template as a
TaffyDB object. The template then used TaffyDB queries to remove unneeded doclets, and to retrieve
the doclets that were needed to generate documentation.
Salty exists because TaffyDB is no longer maintained and is the subject of a
[CVE](https://www.cve.org/CVERecord?id=CVE-2019-10790), causing TaffyDB to be flagged as a security
risk. There's no real security risk, but it sure looks like there is.
Also, TaffyDB [can't decide what license it uses](https://github.com/typicaljoe/taffydb/issues/166):
- The [README](https://github.com/typicaljoe/taffydb/blame/d4870cee370abffe510ba598b02e4e7ad6af5d2a/README.md#L146-L156)
says that TaffyDB uses the [1-clause BSD License](https://opensource.org/licenses/BSD-1-Clause).
- The [`package.json` file](https://github.com/typicaljoe/taffydb/blob/d4870cee370abffe510ba598b02e4e7ad6af5d2a/package.json#L32)
says that TaffyDB uses the [2-clause BSD License](https://opensource.org/licenses/BSD-2-Clause).
- The [`License` file](https://github.com/typicaljoe/taffydb/blob/d4870cee370abffe510ba598b02e4e7ad6af5d2a/License)
says that TaffyDB uses the [MIT License](https://opensource.org/licenses/MIT).
By replacing TaffyDB with Salty, which uses the
[Apache 2.0 License](https://github.com/jsdoc/jsdoc/blob/main/packages/jsdoc-salty/LICENSE), JSDoc
resolved the purported security issue and the licensing uncertainty.
## Use Salty in a JSDoc template
Starting in version 4.0.0, JSDoc no longer uses the `taffydb` package as a dependency. If you use a
JSDoc template that comes with JSDoc 4.0.0 or later, then you don't need to make any changes to the
template.
Otherwise, your template might use the `taffydb` package. After you replace `taffydb` with
`@jsdoc/salty`, your template should remain compatible with JSDoc 3.x.
To replace `taffydb` with `@jsdoc/salty`, do the following:
1. In the template's `publish.js` file, find the line or lines that require `taffydb`. They should
look similar to one of the following:
```js
// Old-school, without object destructuring (might use `var` or `let` instead of `const`)
const taffy = require('taffydb').taffy;
// New-school, with object destructuring
const { taffy } = require('taffydb');
```
2. Replace `taffydb` with `@jsdoc/salty`:
```js
// Old-school, without object destructuring
const taffy = require('@jsdoc/salty').taffy;
// New-school, with object destructuring
const { taffy } = require('@jsdoc/salty');
```
3. If the template has a `package.json` file that includes `taffydb` as a dependency, then remove
the `taffydb` dependency.
4. In the template's `package.json` file, add `@jsdoc/salty` as a dependency.
5. Run `npm install` in the template directory, then confirm that the template works as expected.
## Supported TaffyDB features
Salty supports only the TaffyDB features that have historically been used by JSDoc templates. That
means that most TaffyDB functionality is missing.
Specifically, Salty lets you do the following:
### Create a database
```js
let db = taffy([{ a: 3 }, { a: 1, b: 'hello' }, { a: 7, b: 2 }]);
```
### Sort items in a database
Items are sorted in place. Salty uses the following sort order, which differs from, but is more
predictable than, TaffyDB:
1. Non-null, non-undefined values, in standard sort order
2. Null values
3. Explicitly undefined values: key is present, value is undefined
4. Implicitly undefined values: key is not present
```js
// Sort by the `a` property
db.sort('a');
// Sort by the `a` property, then the `b` property
db.sort('a, b');
```
### Get items from a database
```js
// Get array of all items
const emptyMatcher = db().get();
// Get array of items where `a` is either `1` or `3`
const arrayMatcher = db({ a: [1, 3] }).get();
// Get array of items where `a` is `1` and `b` is `hello`
const multiMatcher = db({ a: 1 }, { b: 'hello' }).get();
// Get array of items where `b` is undefined
const undefinedMatcher = db({ b: { isUndefined: true } }).get();
// Get array of items where `b` starts with `he`
const leftMatcher = db({ b: { left: 'he' } }).get();
// Get array of items where `b` ends with `lo`
const rightMatcher = db({ b: { right: 'lo' } }).get();
```
### Get items with a custom query function
Within the query function, `this` is bound to the current item. As a result, the custom query
function cannot be an arrow function.
```js
function query() {
return this.a > 1;
}
const items = db(query).get();
// `items` is `[{ a: 3 }, { a: 7, b: 2 }]`
```
### Iterate over items in a database
```js
// Iterate over all items
db().each((item, i) => console.log(`'b' property at index ${i}: ${item.b}`));
// Iterate over items where `b` equals `hello`
db({ b: 'hello' }).each((item) => console.log(`'a' property: ${item.a}`));
```
### Remove items from a database
```js
// Remove items where `a` equals `7`
db({ a: 7 }).remove(); // returns `1` (the number of items removed)
// Remove items where `b` is undefined
db({ b: { isUndefined: true } }).remove(); // returns `1`
// Remove items where `b` is defined
db({ b: { isUndefined: false } }).remove(); // returns `1`
// Remove all items
db().remove();
```
## New features
Salty probably won't gain any new features, ever. It exists solely to meet the requirements of
JSDoc.
The exception is if a JSDoc template uses TaffyDB features that aren't available in Salty. If that's
the case, [create an issue](https://github.com/jsdoc/jsdoc/issues) with details about the template
you're using and the feature that's missing.
## TaffyDB, JSDoc, and security
Is TaffyDB a security risk? And has JSDoc ever used TaffyDB in a way that creates a security risk?
The answer to both questions is no.
First, [CVE-2019-10790](https://www.cve.org/CVERecord?id=CVE-2019-10790) says that "attackers can
use [the TaffyDB] vulnerability to access any data items in the DB." But JSDoc used TaffyDB only to
store data about your JavaScript code. That data is no more sensitive than the code itself.
Also, JSDoc doesn't persist the TaffyDB data to disk. It exists only while JSDoc is running.
Most important of all, TaffyDB doesn't pretend to have any sort of access control. To the contrary,
TaffyDB _intentionally_ makes it very easy to access all of the data in a DB. If your DB is stored
in a variable named `db`, then calling `db().get()` retrieves all of the data in the DB.
[This method is documented](https://taffydb.com/working_with_data.html) as the "[p]refered [sic]
method for extracting data." Because you can always access _all_ of the data, it's unclear why a bug
that lets you access _some_ of the data would create a security risk.
So Salty doesn't mitigate a security risk or fix a security issue. However, in general, it's not a
good idea to tell people to ignore CVEs; also, it can be difficult to convince your colleagues or
employer to ignore a specific CVE. For those reasons, it was worth the trouble to replace TaffyDB.
## What's with the name?
It's a play on "saltwater taffy." Hilarious!