From 5d775b0a647fd30ad0c0d379bbb207eab38e75e3 Mon Sep 17 00:00:00 2001 From: Jonatan Nilsson Date: Sat, 21 Sep 2024 00:55:04 +0000 Subject: [PATCH] meme: Use brotli to compress everything --- README.md | 185 +-------------------------------------------------- check.mjs | 1 + compress.mjs | 15 +++++ meme.mjs | 1 + package.json | 20 ++---- 5 files changed, 23 insertions(+), 199 deletions(-) create mode 100644 check.mjs create mode 100644 compress.mjs create mode 100644 meme.mjs diff --git a/README.md b/README.md index f4018a3..71bcdfd 100644 --- a/README.md +++ b/README.md @@ -1,186 +1,3 @@ # fs-cache-fast -fs-cache-fast is a small, no dependancy, both promise and sync based file system cache storage. -This package is designed to be a smaller, lighter, drop-in replacement for [file-system-cache](https://www.npmjs.com/package/file-system-cache). - -# Installation - -Install with npm: - -```bash -$ npm install --save fs-cache-fast -``` - -# Getting started - -The api is extremely simple: - -```javascript -import Cache from 'fs-cache-fast' - -let cache = new Cache() - -cache.setSync('my-key', { value: 'here' }) -let item = cache.getSync('my-key', { fallback: 'here' }) - -await cache.set('another-key', 'Hi there') -let result = await cache.get('another-key') -``` - -# Api - -### new Cache(options) - -Create a new cache with the specified directory (if directory is skipped, it randomly generates one in fs.tmp on each run). - -Possible values in options: - -```javascript -{ - prefix: 'myprefix', // Add a prefix to every cached filename that is generated - ns: 'myprefix', // Alternative name for prefix, for API compatibility with file-system-cache - hash_alg: 'sha256', // Use the specified hashing algorithm that is used to generate the filename - cache_dir: '/tmp/MY_CACHE', // The directory where all the cache gets stored, gets auto-created if not exist. - ttl: 60, // Expiration in seconds for each cache item. -} -``` - -The default options are as follow: - -```javascript -{ - prefix: '-', - hash_alg: 'md5', - cache_dir: path.join(os.tmpdir(), /* random id */), - ttl: 0, -} -``` - -### cache.get(key, fallback = null) - -Promise get the cache value that exists with item `key` and if it doesn't exist or has expired, returns the fallback value instead. - -```javascript -let myCache = await cache.get('mykey', null) -``` - -### cache.getSync(key, fallback = null) - -Immediately get the cache value that exists with item `key` and if it doesn't exist or has expired, returns the fallback value instead. - -```javascript -let myCache = cache.getSync('mykey', null) -``` - -### cache.set(key, content, ttl | { ttl: number } = null) - -Promise store the content as cache with the specified key (with optional overwriting default ttl set on the cache constructor). - -```javascript -await cache.set('mykey', { hello: 'world' }) -``` - -### cache.setSync(key, content, ttl | { ttl: number } = null) - -Immediately store the content as cache with the specified key (with optional overwriting default ttl set on the cache constructor). - -```javascript -cache.setSync('mykey', { hello: 'world' }, 5 * 60) // Expire this after 5 minutes -``` - -### cache.setMany(items, ttl | { ttl: number } = null) -### cache.save(items, ttl | { ttl: number } = null) - -Promise store multiple items all at once while optionally overwriting the ttl for these entries. -Items take form of an array of json objects with the following signature: `{ key, content }` - -**Note**, for backwards compatibility with `file-system-cache` you can also use the property `value` instead of `content`. - -```javascript -await cache.setMany([ - { key: 'one', content: 'Store this' }, - { key: 'two', content: { a: 'and also this' } }, -]) - -await cache.save([ - { key: 'one', value: 'Store this' }, - { key: 'two', value: { a: 'and also this' } }, -]) -``` - -### cache.setManySync(items, ttl | { ttl: number } = null) -### cache.saveSync(items, ttl | { ttl: number } = null) - -Immediately store multiple items all at once while optionally overwriting the ttl for these entries. -Items take form of an array of json objects with the following signature: `{ key, content }` - -**Note**, for backwards compatibility with `file-system-cache` you can also use the property `value` instead of `content`. - -**Note**, there's an alternative name for it called `.saveSync(...)` for retaining similar naming schema as `file-system-cache` (it does not provide this functionality). - -```javascript -cache.setManySync([ - { key: 'one', content: 'Store this' }, - { key: 'two', content: { a: 'and also this' } }, -], 10 * 60) // Expire all of these after 10 minutes. - -cache.saveSync([ - { key: 'one', value: 'Store this' }, - { key: 'two', value: { a: 'and also this' } }, -], 10 * 60) // Expire all of these after 10 minutes. -``` - -### cache.remove(key) - -Promise remove a cache with the specified key. - -```javascript -await cache.remove('mykey') -``` - -### cache.removeSync(key) - -Immediately remove a cache with the specified key. - -```javascript -cache.removeSync('mykey') -``` - -### cache.clear() - -Promise remove all items in the cache directory that match the specified `prefix` or `ns` if you will. - -```javascript -await cache.clear() -``` - -### cache.clearSync() - -Immediately remove all items in the cache directory that match the specified `prefix` or `ns` if you will. - -```javascript -cache.clearSync() -``` - -### cache.getAll() - -Promise return all items currently residing in the cache that have valid ttl. -This returns an array of objects, each one with with following signature: `{ key, content, ttl }` - -```javascript -let items = await cache.getAll() -// items[0] = { key: 'one', content: 'Store this' } -// items[1] = { key: 'two', content: { a: 'and also this' } } -``` - -### cache.load() - -Promise return all items currently residing in the cache that have valid ttl. -This is an API compatible version with `file-system-cache` and returns the results slightly different to maintain compatibility. -Returns an object with key files that has an array of items with this signature: `{ path, value, key }` - -```javascript -let items = await cache.load() -// items.files[0] = { path: '...', value: 'Store this', key: 'one' } -// items.files[1] = { path: '...', value: { a: 'and also this' }, key: 'two' } -``` \ No newline at end of file +Meme version with maximum saving of fs-cache-fast, see original: https://git.nfp.is/TheThing/fs-cache-fast \ No newline at end of file diff --git a/check.mjs b/check.mjs new file mode 100644 index 0000000..76e1a4c --- /dev/null +++ b/check.mjs @@ -0,0 +1 @@ +import Cache from './meme.mjs' \ No newline at end of file diff --git a/compress.mjs b/compress.mjs new file mode 100644 index 0000000..dddd6cc --- /dev/null +++ b/compress.mjs @@ -0,0 +1,15 @@ +import fs from 'fs' +import zlib from 'zlib' + +var original = fs.readFileSync('./index.mjs', 'utf-8') + .replace(/export default /, 'out = ') + .replace(/import [^ ]+ from '[^']+'\w*\n/g, '') + .replace(/fsSyncOriginal/, 'fS') + .replace(/fsPromisesOriginal/, 'fP') + .replace(/crypto\./g, 'C.') + .replace(/path\./g, 'P.') + .replace(/os\./g, 'O.') + .trim() +var compressed = zlib.brotliCompressSync(Buffer.from(original)) + +fs.writeFileSync('meme.mjs', `import fS from 'fs';import fP from 'fs/promises';import C from 'crypto';import P from 'path';import O from 'os';import z from 'zlib';let out;eval(z.brotliDecompressSync(Buffer.from('${compressed.toString('base64')}','base64')).toString());export default out;`) \ No newline at end of file diff --git a/meme.mjs b/meme.mjs new file mode 100644 index 0000000..f127a3a --- /dev/null +++ b/meme.mjs @@ -0,0 +1 @@ +import fS from 'fs';import fP from 'fs/promises';import C from 'crypto';import P from 'path';import O from 'os';import z from 'zlib';let out;eval(z.brotliDecompressSync(Buffer.from('G68PAIzTFfEjmBImXPKf6WzPMr1TPklLzowzmWrjiUFMgIo1iE+PQr///VrdHon53pl5K/5XsSSazP8T/iKeOCRL0CBUciFXHoPpMn8FlZRFuV6PHWRYkj2P7uVYXnqAvs3VhuIJvsDkUEdkR/Pq/6Tv9JRZjpUBGicgc5D++bRaIRpNDZNglkDQB31vuT1VkB4EZ0/fz522tH/Mx6mjysh/dXLEOC//8BGGcQfrMl6USHgeEiGZqOqTFINBapUxFSXkFtDv3d+/RQxpasnEel6qYwxqyOtvlZqlS8e+2h/JjdWecGWzmyfeITff6GfOFWUgBdj1Peb0wvATu9Hzuu+p71RSHxsRIXPXexCagQG788l7knvS2yTKXKVmeQWRttSxxKcdzqUT/ZEnXaxbX12XU/tW2l/e7NOsSY1W5F92qY6qnqqIWqLkkjx1L9PY3YV9iOt8VzaTqZsYtTq8dBUmh5ewQq1pk9RQq65U6KYLOZhATGEJwnA4ENKY1PiokTR5HUaQa8wMVqsDIa5bk6wWFyBtZqTdaiPX845znCa2eLhB+WTg8OZGayJtI93i9X5Lozkt5Xp+oS5tTe2iUpEi1okFWPGuGE3zC7OMD50rLvzrUwGImLJaZfA7LinJaRZ1vUpOLqRHYk5BJfXN/usADyLR+ayjRFfJTKzdwlMr9PyBOoPuqyq8MEZ8j8dcS2En9uOZdmNjF50xNmMESZRV5H9PVni6nlujjMnT2hjkJoFIBR5RtN9kwkoFG5FdLol9td823ycYvTwXRbMGC0lWE1a9ovhhBDetBM2Axibu7cLuoF5n6M0eB7nwY33iBnODpf4axHCN/wOsSlUN6jf3CvskwLRApu8KfHJ8uV8Cq5ndFEmwJOO9YgRE8D5pY1yEtrohPuONYIJo3GXABB5jgAL5ngTaM+mMUeoaFdrhiZEEzdVX/Y2yhFYICxA14YX4n3oQuDKmMTpx9YSahIAqoSW+OFLa7EoS+/gfauObEvXD7W/iHQubFbpyvFBWsTHFi9dxnMVMVLg8FiPgKIaVKKEt+XUuJ35t6c4YVLvwxi+ZLU0tXdxlrYQsZkZL47B9h9mPZxTTlOK90EsqNd2gBQMWNqAcGRMNDBtivpOc5xy3ZzybjXIrpcdFBVECfSFzyn0SkeEOxw9BJ09eTFCTI0xk932s3V1RkOfgLarh+2ciQtvrZUz0nwWOiqXDT93BZSUzKz0GkHp4mzcpEJc1wZzr+Hh3FxvBOUF5oyJPfBVsl1vyhLGyr16HGAA2GeL3Nkdt2cQq8dqPjLaQ9Z/56vkz4E4y2orytyFy1wIt/Vy3vItnPhzlDO/4HW6Xkd7pmEk6QV/CmpMjjqO6Bg==','base64')).toString());export default out; \ No newline at end of file diff --git a/package.json b/package.json index 23bac09..df3385d 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,10 @@ { "name": "fs-cache-fast", - "version": "1.0.2", + "version": "0.0.2", "description": "Cache stored on the file system", - "main": "index.mjs", + "main": "meme.mjs", "scripts": { - "test": "eltro", - "test:watch": "eltro -r dot -w test" - }, - "watch": { - "test": { - "patterns": [ - "./" - ], - "extensions": "mjs" - } + "test": "eltro" }, "repository": { "type": "git", @@ -25,8 +16,7 @@ "eltro": "^1.5.0" }, "files": [ - "index.mjs", - "README.md", - "LICENSE" + "meme.mjs", + "README.md" ] }