Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/julianrubisch/express-asset-file-cache-middleware
An express.js middleware to locally cache assets (images, videos, audio, etc.) for faster access and proxying, for use in e.g. Electron apps
https://github.com/julianrubisch/express-asset-file-cache-middleware
electron-apps express express-middleware expressjs javascript node nodejs
Last synced: 18 days ago
JSON representation
An express.js middleware to locally cache assets (images, videos, audio, etc.) for faster access and proxying, for use in e.g. Electron apps
- Host: GitHub
- URL: https://github.com/julianrubisch/express-asset-file-cache-middleware
- Owner: julianrubisch
- Created: 2019-12-07T18:22:50.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2023-03-03T11:02:06.000Z (over 1 year ago)
- Last Synced: 2024-10-10T04:53:29.319Z (29 days ago)
- Topics: electron-apps, express, express-middleware, expressjs, javascript, node, nodejs
- Language: JavaScript
- Size: 111 KB
- Stars: 13
- Watchers: 3
- Forks: 6
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# express-asset-file-cache-middleware
[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-)
![Build Status](https://github.com/julianrubisch/express-asset-file-cache-middleware/workflows/Node%20CI/badge.svg)
A modest express.js middleware to locally cache assets (images, videos, audio, etc.) for faster access and proxying, for use in e.g. Electron apps.
## TL;DR
For offline use of dynamic assets, e.g. in your Electron app or local express server.
## Usage
```javascript
const express = require("express");
const fileCacheMiddleware = require("express-asset-file-cache-middleware");const app = express();
app.get(
"/assets/:asset_id",
async (req, res, next) => {
res.locals.fetchUrl = `https://cdn.example.org/path/to/actual/asset/${req.params.asset_id}`;res.locals.cacheKey = `${someExpirableUniqueKey}`;
next();
},
fileCacheMiddleware({ cacheDir: "/tmp", maxSize: 10 * 1024 * 1024 * 1024 }),
(req, res) => {
res.set({
"Content-Type": res.locals.contentType,
"Content-Length": res.locals.contentLength
});
res.end(res.locals.buffer, "binary");
}
);app.listen(3000);
```It works by fetching your asset in between two callbacks on e.g. a route, by attaching a `fetchUrl` onto `res.locals`. When the asset isn't cached on disk already, it will write it into a directory specified by the option `cacheDir`. If it finds a file that's alread there, it will use that.
The asset's `contentType` and `contentLength` are stored base64 encoded in the filename, thus no offline database is necessary
Note that setting `cacheKey` and `cacheDir` isn't strictly necessary, it will fall back to `res.local.fetchUrl` and `path.join(process.cwd(), "/tmp")`, respectively.
## LRU Eviction
To avoid cluttering your device, an LRU (least recently used) cache eviction strategy is in place. Per default, when your cache dir grows over 1 GB of size, the least recently used (accessed) files will be evicted (deleted), until enough disk space is available again. You can change the cache dir size by specifying `options.maxSize` (in bytes) when creating the middleware.
## Install
$ npm install express-asset-file-cache-middleware
or$ yarn add express-asset-file-cache-middleware
## API### Input
#### `res.locals.fetchUrl` (required)
The URL of the asset to cache.
#### `res.locals.cacheKey` (optional)
A unique, expireable cache key. If your asset contains a checksum/digest, you're already done, because it falls back to `res.locals.fetchUrl`.
### Output
To further process the response, the following entries of `res.locals` are set:
#### `res.locals.buffer`
The cached asset as a binary buffer. Most likely, you will end the request chain with
```javascript
res.end(res.locals.buffer, "binary");
```#### `res.locals.contentType` and `res.locals.contentLength`
If you're serving your assets in the response, you'll need to set
```javascript
res.set({
"Content-Type": res.locals.contentType,
"Content-Length": res.locals.contentLength
});
```
## OptionsYou can pass the following options to the middleware:
### `cacheDir` (optional)
The root directory where the file cache will be located. Falls back to `path.join(process.cwd(), "/tmp")`.
### `logger` (optional)
A logger to use for debugging, e.g. Winston, console, etc.
### `maxSize` (optional)
The maximum size of the cache directory, from which LRU eviction is applied. Defaults to 1 GB (1024 * 1024 * 1024).## Tests
Run the test suite:
```bash
# install dependencies
$ npm install# unit tests
$ npm test
```## License
The MIT License (MIT)
Copyright (c) 2019 Julian Rubisch
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!