diff --git a/.github/workflows/ci-apps-web.yml b/.github/workflows/ci-apps-web.yml index a30b326d..40cc8219 100644 --- a/.github/workflows/ci-apps-web.yml +++ b/.github/workflows/ci-apps-web.yml @@ -81,6 +81,9 @@ jobs: run: | pnpm --filter=web build env: + NEXTAUTH_URL: https://localhost:3000 + NEXTAUTH_SECRET: secret + APP_CACHE_DSN: '' # Speed up build: they are linted in a previous step NEXT_IGNORE_ESLINT: true # Speed up build: they are type-checked in a previous step diff --git a/apps/web/package.json b/apps/web/package.json index 52aa64aa..242c5471 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -24,6 +24,8 @@ "@heroicons/react": "2.0.18", "@hookform/resolvers": "3.1.1", "@httpx/exception": "1.8.2", + "@soluble/cache-interop": "^0.12.8", + "@soluble/cache-ioredis": "^0.13.11", "@soluble/dsn-parser": "^1.9.2", "@vercel/analytics": "1.0.1", "@wayofdev/facebook-pixel": "workspace:*", diff --git a/apps/web/src/config/app-cache.config.tsx b/apps/web/src/config/app-cache.config.tsx new file mode 100644 index 00000000..da570fa0 --- /dev/null +++ b/apps/web/src/config/app-cache.config.tsx @@ -0,0 +1,13 @@ +import { MapCacheAdapter } from '@soluble/cache-interop' +import { getIoRedisOptionsFromDsn, IoRedisCacheAdapter } from '@soluble/cache-ioredis' + +const appCacheDsn = process.env.APP_CACHE_DSN ?? null + +export const appCache = !appCacheDsn + ? new MapCacheAdapter() + : new IoRedisCacheAdapter({ + connection: getIoRedisOptionsFromDsn(appCacheDsn, { + connectTimeout: 3_000, + maxRetriesPerRequest: 2, + }), + }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c39c0d13..eea5bc5a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -262,6 +262,12 @@ importers: '@httpx/exception': specifier: 1.8.2 version: 1.8.2 + '@soluble/cache-interop': + specifier: ^0.12.8 + version: 0.12.8 + '@soluble/cache-ioredis': + specifier: ^0.13.11 + version: 0.13.11 '@soluble/dsn-parser': specifier: ^1.9.2 version: 1.9.2 @@ -4936,6 +4942,10 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@ioredis/commands@1.2.0: + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: false + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -6168,6 +6178,22 @@ packages: size-limit: 8.2.6 dev: true + /@soluble/cache-interop@0.12.8: + resolution: {integrity: sha512-6oyzHAMBe/IhsjF3s8XhFAatAgUpMPE+CFmobUVxaUtzKFAEU71Hd0bFZ6pneqvz/VClNzRhT6AznjcoV3I6ww==} + engines: {node: ^14.13.1 || >=16} + dev: false + + /@soluble/cache-ioredis@0.13.11: + resolution: {integrity: sha512-mZJG7sG+JfpmCO6bKK8uID9U2TDNfWPwp71yDMquytZgGwiBNS17gwmoqS+ig8o/GFjjUycJdUiRnBEiVAuNGg==} + engines: {node: ^14.13.1 || >=16} + dependencies: + '@soluble/cache-interop': 0.12.8 + '@soluble/dsn-parser': 1.9.2 + ioredis: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + /@soluble/dsn-parser@1.9.2: resolution: {integrity: sha512-FgkvHHHSCzjQ1/ouW6Vtw2hy0k5/KWeu116swH5VYX267I4rx+8MCy9/6eZ60IWGIQVNgh0sektKAu0n9gtzzA==} dev: false @@ -10127,6 +10153,11 @@ packages: engines: {node: '>=6'} dev: false + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + dev: false + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -11200,6 +11231,11 @@ packages: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -13707,6 +13743,23 @@ packages: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} dev: false + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /ip@2.0.0: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} dev: true @@ -15250,10 +15303,18 @@ packages: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false + /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: false + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: false + /lodash.isfunction@3.0.9: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} dev: true @@ -18873,6 +18934,18 @@ packages: strip-indent: 4.0.0 dev: true + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + dev: false + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + dev: false + /refa@0.11.0: resolution: {integrity: sha512-486O8/pQXwj9jV0mVvUnTsxq0uknpBnNJ0eCUhkZqJRQ8KutrT1PhzmumdCeM1hSBF2eMlFPmwECRER4IbKXlQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -19783,6 +19856,10 @@ packages: type-fest: 0.7.1 dev: true + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: false + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'}