Cache attachments on external host with service worker (#7493)
This commit is contained in:
		
				
					committed by
					
						 Eugen Rochko
						Eugen Rochko
					
				
			
			
				
	
			
			
			
						parent
						
							03f4c214b4
						
					
				
				
					commit
					d95642f6d9
				
			| @@ -88,6 +88,10 @@ SMTP_FROM_ADDRESS=notifications@example.com | ||||
| # CDN_HOST=https://assets.example.com | ||||
|  | ||||
| # S3 (optional) | ||||
| # The attachment host must allow cross origin request from WEB_DOMAIN or | ||||
| # LOCAL_DOMAIN if WEB_DOMAIN is not set. For example, the server may have the | ||||
| # following header field: | ||||
| # Access-Control-Allow-Origin: https://192.168.1.123:9000/ | ||||
| # S3_ENABLED=true | ||||
| # S3_BUCKET= | ||||
| # AWS_ACCESS_KEY_ID= | ||||
| @@ -97,6 +101,8 @@ SMTP_FROM_ADDRESS=notifications@example.com | ||||
| # S3_HOSTNAME=192.168.1.123:9000 | ||||
|  | ||||
| # S3 (Minio Config (optional) Please check Minio instance for details) | ||||
| # The attachment host must allow cross origin request - see the description | ||||
| # above. | ||||
| # S3_ENABLED=true | ||||
| # S3_BUCKET= | ||||
| # AWS_ACCESS_KEY_ID= | ||||
| @@ -108,6 +114,8 @@ SMTP_FROM_ADDRESS=notifications@example.com | ||||
| # S3_SIGNATURE_VERSION= | ||||
|  | ||||
| # Swift (optional) | ||||
| # The attachment host must allow cross origin request - see the description | ||||
| # above. | ||||
| # SWIFT_ENABLED=true | ||||
| # SWIFT_USERNAME= | ||||
| # For Keystone V3, the value for SWIFT_TENANT should be the project name | ||||
|   | ||||
| @@ -7,6 +7,9 @@ env: | ||||
|   es6: true | ||||
|   jest: true | ||||
|  | ||||
| globals: | ||||
|   ATTACHMENT_HOST: false | ||||
|  | ||||
| parser: babel-eslint | ||||
|  | ||||
| plugins: | ||||
|   | ||||
| @@ -49,7 +49,7 @@ self.addEventListener('fetch', function(event) { | ||||
|  | ||||
|       return response; | ||||
|     })); | ||||
|   } else if (storageFreeable && process.env.CDN_HOST ? url.host === process.env.CDN_HOST : url.pathname.startsWith('/system/')) { | ||||
|   } else if (storageFreeable && (ATTACHMENT_HOST ? url.host === ATTACHMENT_HOST : url.pathname.startsWith('/system/'))) { | ||||
|     event.respondWith(openSystemCache().then(cache => { | ||||
|       return cache.match(event.request.url).then(cached => { | ||||
|         if (cached === undefined) { | ||||
|   | ||||
| @@ -6,8 +6,9 @@ const CompressionPlugin = require('compression-webpack-plugin'); | ||||
| const sharedConfig = require('./shared.js'); | ||||
| const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; | ||||
| const OfflinePlugin = require('offline-plugin'); | ||||
| const { env, publicPath } = require('./configuration.js'); | ||||
| const { publicPath } = require('./configuration.js'); | ||||
| const path = require('path'); | ||||
| const { URL } = require('url'); | ||||
|  | ||||
| let compressionAlgorithm; | ||||
| try { | ||||
| @@ -19,6 +20,21 @@ try { | ||||
|   compressionAlgorithm = 'gzip'; | ||||
| } | ||||
|  | ||||
| let attachmentHost; | ||||
|  | ||||
| if (process.env.S3_ENABLED === 'true') { | ||||
|   if (process.env.S3_CLOUDFRONT_HOST) { | ||||
|     attachmentHost = process.env.S3_CLOUDFRONT_HOST; | ||||
|   } else { | ||||
|     attachmentHost = process.env.S3_HOSTNAME || `s3-${process.env.S3_REGION || 'us-east-1'}.amazonaws.com`; | ||||
|   } | ||||
| } else if (process.env.SWIFT_ENABLED === 'true') { | ||||
|   const { host } = new URL(process.env.SWIFT_OBJECT_URL); | ||||
|   attachmentHost = host; | ||||
| } else { | ||||
|   attachmentHost = null; | ||||
| } | ||||
|  | ||||
| module.exports = merge(sharedConfig, { | ||||
|   output: { | ||||
|     filename: '[name]-[chunkhash].js', | ||||
| @@ -90,7 +106,7 @@ module.exports = merge(sharedConfig, { | ||||
|         '**/*.woff', | ||||
|       ], | ||||
|       ServiceWorker: { | ||||
|         entry: `imports-loader?process.env=>${encodeURIComponent(JSON.stringify(env))}!${encodeURI(path.join(__dirname, '../../app/javascript/mastodon/service_worker/entry.js'))}`, | ||||
|         entry: `imports-loader?ATTACHMENT_HOST=>${encodeURIComponent(JSON.stringify(attachmentHost))}!${encodeURI(path.join(__dirname, '../../app/javascript/mastodon/service_worker/entry.js'))}`, | ||||
|         cacheName: 'mastodon', | ||||
|         output: '../assets/sw.js', | ||||
|         publicPath: '/sw.js', | ||||
|   | ||||
		Reference in New Issue
	
	Block a user