Skip to content

Commit

Permalink
feat: add setter to sqlite cache store
Browse files Browse the repository at this point in the history
  • Loading branch information
ronag committed Jan 18, 2025
1 parent 45eaed2 commit d6fd36f
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 37 deletions.
94 changes: 57 additions & 37 deletions lib/cache/sqlite-cache-store.js
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,62 @@ module.exports = class SqliteCacheStore {
return result
}

/**
* @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key
* @param {import('../../types/cache-interceptor.d.ts').default.CacheValue & { body: Buffer | null }} value
*/
set (key, value) {
assertCacheKey(key)
assertCacheValue(value)

const body = value.body
const size = body ? body.byteLength : 0

if (size > this.#maxEntrySize) {
return false
}

const url = this.#makeValueUrl(key)

const existingValue = this.#findValue(key, true)
if (existingValue) {
// Updating an existing response, let's overwrite it
this.#updateValueQuery.run(
body,
value.deleteAt,
value.statusCode,
value.statusMessage,
value.headers ? JSON.stringify(value.headers) : null,
value.etag ? value.etag : null,
value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,
value.cachedAt,
value.staleAt,
value.deleteAt,
existingValue.id
)
} else {
this.#prune()
// New response, let's insert it
this.#insertValueQuery.run(
url,
key.method,
body,
value.deleteAt,
value.statusCode,
value.statusMessage,
value.headers ? JSON.stringify(value.headers) : null,
value.etag ? value.etag : null,
value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,
value.vary ? JSON.stringify(value.vary) : null,
value.cachedAt,
value.staleAt,
value.deleteAt
)
}

return true
}

/**
* @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key
* @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} value
Expand All @@ -260,7 +316,6 @@ module.exports = class SqliteCacheStore {
assertCacheKey(key)
assertCacheValue(value)

const url = this.#makeValueUrl(key)
let size = 0
/**
* @type {Buffer[] | null}
Expand All @@ -285,42 +340,7 @@ module.exports = class SqliteCacheStore {
callback()
},
final (callback) {
const existingValue = store.#findValue(key, true)
if (existingValue) {
// Updating an existing response, let's overwrite it
store.#updateValueQuery.run(
Buffer.concat(body),
value.deleteAt,
value.statusCode,
value.statusMessage,
value.headers ? JSON.stringify(value.headers) : null,
value.etag ? value.etag : null,
value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,
value.cachedAt,
value.staleAt,
value.deleteAt,
existingValue.id
)
} else {
store.#prune()
// New response, let's insert it
store.#insertValueQuery.run(
url,
key.method,
Buffer.concat(body),
value.deleteAt,
value.statusCode,
value.statusMessage,
value.headers ? JSON.stringify(value.headers) : null,
value.etag ? value.etag : null,
value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null,
value.vary ? JSON.stringify(value.vary) : null,
value.cachedAt,
value.staleAt,
value.deleteAt
)
}

store.set(key, { ...value, body: Buffer.concat(body) })
callback()
}
})
Expand Down
4 changes: 4 additions & 0 deletions lib/util/cache.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ function assertCacheValue (value) {
if (value.etag !== undefined && typeof value.etag !== 'string') {
throw new TypeError(`expected value.etag to be string, got ${typeof value.etag}`)
}

if (value.body !== undefined && !Buffer.isBuffer(value.body)) {
throw new TypeError(`expected value.body to be Buffer, got ${typeof value.body}`)
}
}

/**
Expand Down

0 comments on commit d6fd36f

Please sign in to comment.