feat(medusa,utils): add server level configurable http compression (#3785)
* feat(medusa,utils): add server level configurable http compression * chore: remove unwanted middleware * chore: add a log for running compression * chore: change package position * chore: reposition options * chore: change equality
This commit is contained in:
1 parent
1eab1b740f
commit
4f58ddee03
8 files changed
+77
-2
No files matched your search
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/medusa": patch
|
||||||
|
"@medusajs/types": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
feat(medusa,utils): add server level configurable http compression
|
||||||
@@ -5,6 +5,7 @@ const DB_NAME = process.env.DB_TEMP_NAME
|
|||||||
|
|
||||||
const redisUrl = process.env.REDIS_URL || "redis://localhost:6379"
|
const redisUrl = process.env.REDIS_URL || "redis://localhost:6379"
|
||||||
const cacheTTL = process.env.CACHE_TTL || 15
|
const cacheTTL = process.env.CACHE_TTL || 15
|
||||||
|
const enableResponseCompression = process.env.ENABLE_RESPONSE_COMPRESSION || true
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
plugins: [],
|
plugins: [],
|
||||||
@@ -14,6 +15,9 @@ module.exports = {
|
|||||||
database_type: "postgres",
|
database_type: "postgres",
|
||||||
jwt_secret: "test",
|
jwt_secret: "test",
|
||||||
cookie_secret: "test",
|
cookie_secret: "test",
|
||||||
|
http_compression: {
|
||||||
|
enabled: enableResponseCompression
|
||||||
|
}
|
||||||
},
|
},
|
||||||
modules: {
|
modules: {
|
||||||
cacheService: {
|
cacheService: {
|
||||||
|
|||||||
@@ -55,6 +55,7 @@
|
|||||||
"chokidar": "^3.4.2",
|
"chokidar": "^3.4.2",
|
||||||
"class-transformer": "^0.5.1",
|
"class-transformer": "^0.5.1",
|
||||||
"class-validator": "^0.13.2",
|
"class-validator": "^0.13.2",
|
||||||
|
"compression": "^1.7.4",
|
||||||
"connect-redis": "^5.0.0",
|
"connect-redis": "^5.0.0",
|
||||||
"cookie-parser": "^1.4.6",
|
"cookie-parser": "^1.4.6",
|
||||||
"core-js": "^3.6.5",
|
"core-js": "^3.6.5",
|
||||||
|
|||||||
@@ -1,11 +1,23 @@
|
|||||||
import { Router } from "express"
|
import { Router } from "express"
|
||||||
import errorHandler from "./middlewares/error-handler"
|
import errorHandler from "./middlewares/error-handler"
|
||||||
|
import compression from "compression"
|
||||||
import admin from "./routes/admin"
|
import admin from "./routes/admin"
|
||||||
import store from "./routes/store"
|
import store from "./routes/store"
|
||||||
|
import { shouldCompressResponse, compressionOptions } from "../utils/api"
|
||||||
|
|
||||||
// guaranteed to get dependencies
|
// guaranteed to get dependencies
|
||||||
export default (container, config) => {
|
export default (container, config) => {
|
||||||
const app = Router()
|
const app = Router()
|
||||||
|
const httpCompressionOptions = compressionOptions(config)
|
||||||
|
|
||||||
|
if (httpCompressionOptions.enabled) {
|
||||||
|
app.use(
|
||||||
|
compression({
|
||||||
|
filter: shouldCompressResponse,
|
||||||
|
...httpCompressionOptions,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
admin(app, container, config)
|
admin(app, container, config)
|
||||||
store(app, container, config)
|
store(app, container, config)
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
import { Request, Response, NextFunction } from "express"
|
||||||
|
import compression from "compression"
|
||||||
|
import { Logger } from "@medusajs/types"
|
||||||
|
import {
|
||||||
|
ProjectConfigOptions,
|
||||||
|
HttpCompressionOptions,
|
||||||
|
} from "@medusajs/types"
|
||||||
|
|
||||||
|
export function shouldCompressResponse(req: Request, res: Response) {
|
||||||
|
const logger: Logger = req.scope.resolve("logger")
|
||||||
|
const { projectConfig } = req.scope.resolve("configModule")
|
||||||
|
const { enabled } = compressionOptions(projectConfig)
|
||||||
|
|
||||||
|
if (!enabled) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.headers["x-no-compression"]) {
|
||||||
|
// don't compress responses with this request header
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// fallback to standard filter function
|
||||||
|
return compression.filter(req, res)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function compressionOptions(
|
||||||
|
config: ProjectConfigOptions
|
||||||
|
): HttpCompressionOptions {
|
||||||
|
const responseCompressionOptions = config.http_compression ?? {}
|
||||||
|
|
||||||
|
responseCompressionOptions.enabled = responseCompressionOptions.enabled ?? false
|
||||||
|
responseCompressionOptions.level = responseCompressionOptions.level ?? 6
|
||||||
|
responseCompressionOptions.memLevel = responseCompressionOptions.memLevel ?? 8
|
||||||
|
responseCompressionOptions.threshold =
|
||||||
|
responseCompressionOptions.threshold ?? 1024
|
||||||
|
|
||||||
|
return responseCompressionOptions
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from "./http-compression"
|
||||||
@@ -13,8 +13,14 @@ type SessionOptions = {
|
|||||||
ttl?: number
|
ttl?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ConfigModule = {
|
export type HttpCompressionOptions = {
|
||||||
projectConfig: {
|
enabled?: boolean
|
||||||
|
level?: number
|
||||||
|
memLevel?: number
|
||||||
|
threshold?: number | string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ProjectConfigOptions = {
|
||||||
redis_url?: string
|
redis_url?: string
|
||||||
|
|
||||||
session_options?: SessionOptions
|
session_options?: SessionOptions
|
||||||
@@ -28,12 +34,17 @@ export type ConfigModule = {
|
|||||||
database_schema?: string
|
database_schema?: string
|
||||||
database_logging: LoggerOptions
|
database_logging: LoggerOptions
|
||||||
|
|
||||||
|
http_compression?: HttpCompressionOptions
|
||||||
|
|
||||||
database_extra?: Record<string, unknown> & {
|
database_extra?: Record<string, unknown> & {
|
||||||
ssl: { rejectUnauthorized: false }
|
ssl: { rejectUnauthorized: false }
|
||||||
}
|
}
|
||||||
store_cors?: string
|
store_cors?: string
|
||||||
admin_cors?: string
|
admin_cors?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type ConfigModule = {
|
||||||
|
projectConfig: ProjectConfigOptions
|
||||||
featureFlags: Record<string, boolean | string>
|
featureFlags: Record<string, boolean | string>
|
||||||
modules?: Record<
|
modules?: Record<
|
||||||
string,
|
string,
|
||||||
|
|||||||
@@ -6124,6 +6124,7 @@ __metadata:
|
|||||||
chokidar: ^3.4.2
|
chokidar: ^3.4.2
|
||||||
class-transformer: ^0.5.1
|
class-transformer: ^0.5.1
|
||||||
class-validator: ^0.13.2
|
class-validator: ^0.13.2
|
||||||
|
compression: ^1.7.4
|
||||||
connect-redis: ^5.0.0
|
connect-redis: ^5.0.0
|
||||||
cookie-parser: ^1.4.6
|
cookie-parser: ^1.4.6
|
||||||
core-js: ^3.6.5
|
core-js: ^3.6.5
|
||||||
|
|||||||
Reference in new issue
Block a user