Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
4.8 KiB
174 lines
4.8 KiB
const path = require('path'); |
|
const HtmlWebpackPlugin = require('html-webpack-plugin'); |
|
const MediaQueryPlugin = require('media-query-plugin'); |
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); |
|
const postcssPresetEnv = require('postcss-preset-env'); |
|
const ServiceWorkerWebpackPlugin = require('serviceworker-webpack-plugin'); |
|
const fs = require('fs'); |
|
|
|
const allowedIPs = ['195.66.140.39', '192.168.31.144', '127.0.0.1', '192.168.31.1', '192.168.31.192', '176.100.18.181', '46.219.250.22']; |
|
const devMode = process.env.NODE_ENV !== 'production'; |
|
const useLocal = false; |
|
|
|
console.log('DEVMODE:', devMode); |
|
|
|
const opts = { |
|
MTPROTO_WORKER: true, |
|
version: 3, |
|
"ifdef-verbose": true, // add this for verbose output |
|
"ifdef-triple-slash": true // add this to use double slash comment instead of default triple slash |
|
}; |
|
|
|
module.exports = { |
|
module: { |
|
rules: [ |
|
{ |
|
test: /\.scss$/, |
|
use: [ |
|
devMode ? 'style-loader' : MiniCssExtractPlugin.loader,/* { |
|
loader: MiniCssExtractPlugin.loader, |
|
options: { |
|
hmr: devMode, |
|
reloadAll: true, |
|
} |
|
}, */ |
|
'css-loader?url=false', |
|
devMode ? undefined : MediaQueryPlugin.loader, |
|
{ |
|
loader: 'postcss-loader', |
|
options: { |
|
ident: 'postcss', |
|
plugins: [ |
|
postcssPresetEnv(), |
|
] |
|
} |
|
}, |
|
{ |
|
loader: 'sass-loader', |
|
options: { |
|
sourceMap: devMode |
|
} |
|
} |
|
].filter(l => !!l) |
|
}, |
|
{ |
|
test: /\.ts?$/, |
|
use: [ |
|
'ts-loader', |
|
{ loader: "ifdef-loader", options: opts } |
|
], |
|
exclude: /node_modules/, |
|
}, |
|
{ |
|
test: /\.hbs$/, |
|
use: [ |
|
'handlebars-loader' |
|
] |
|
} |
|
], |
|
}, |
|
|
|
resolve: { |
|
extensions: ['.ts', '.js'], |
|
}, |
|
|
|
entry: './src/index.ts', |
|
/* entry: { |
|
index: './src/index.ts' |
|
}, */ |
|
//devtool: 'inline-source-map', |
|
|
|
output: { |
|
path: path.resolve(__dirname, 'public'), |
|
filename: "[name].bundle.js", |
|
chunkFilename: "[name].chunk.js" |
|
}, |
|
|
|
devServer: { |
|
contentBase: path.join(__dirname, 'public'), |
|
watchContentBase: true, |
|
compress: true, |
|
http2: true, |
|
https: useLocal ? undefined : { |
|
key: fs.readFileSync(__dirname + '/certs/server-key.pem', 'utf8'), |
|
cert: fs.readFileSync(__dirname + '/certs/server-cert.pem', 'utf8') |
|
}, |
|
allowedHosts: useLocal ? undefined : [ |
|
'tweb.enko.club' |
|
], |
|
host: '0.0.0.0', |
|
public: useLocal ? undefined : 'tweb.enko.club', |
|
//host: '192.168.0.105', // '0.0.0.0' |
|
//host: 'tweb.enko.club', // '0.0.0.0' |
|
port: 443, |
|
overlay: true, |
|
before: function(app, server, compiler) { |
|
app.use((req, res, next) => { |
|
let IP = ''; |
|
if(req.headers['cf-connecting-ip']) { |
|
IP = req.headers['cf-connecting-ip']; |
|
} else { |
|
IP = req.connection.remoteAddress.split(':').pop(); |
|
} |
|
|
|
if(!allowedIPs.includes(IP) && !/^192\.168\.\d{1,3}\.\d{1,3}$/.test(IP)) { |
|
console.log('Bad IP connecting: ' + IP, req.url); |
|
res.status(404).send('Nothing interesting here.'); |
|
} else { |
|
if(req.url.indexOf('/assets/') !== 0) { |
|
console.log(req.url, IP); |
|
} |
|
|
|
next(); |
|
} |
|
}); |
|
}, |
|
sockHost: useLocal ? undefined : 'tweb.enko.club', |
|
}, |
|
|
|
plugins: [ |
|
new ServiceWorkerWebpackPlugin({ |
|
entry: path.join(__dirname, 'src/lib/mtproto/mtproto.service.ts'), |
|
filename: 'sw.js', |
|
excludes: ['**/*'], |
|
}), |
|
|
|
new HtmlWebpackPlugin({ |
|
filename: `index.html`, |
|
//template: 'public/index_template.html', |
|
template: 'src/index.hbs', |
|
inject: false, // true, 'head' |
|
minify: { |
|
removeComments: true, |
|
collapseWhitespace: true, |
|
removeRedundantAttributes: true, |
|
useShortDoctype: true, |
|
removeEmptyAttributes: true, |
|
removeStyleLinkTypeAttributes: true, |
|
keepClosingSlash: true, |
|
minifyJS: true, |
|
minifyCSS: true, |
|
minifyURLs: true |
|
}, |
|
chunks: "all", |
|
excludeChunks: [] |
|
}), |
|
|
|
new MiniCssExtractPlugin({ |
|
// Options similar to the same options in webpackOptions.output |
|
// both options are optional |
|
filename: '[name].css', |
|
chunkFilename: '[id].css', |
|
}), |
|
|
|
new MediaQueryPlugin({ |
|
include: [ |
|
'style' |
|
], |
|
queries: { |
|
'only screen and (max-width: 720px)': 'mobile', |
|
'only screen and (min-width: 721px)': 'desktop', |
|
} |
|
}), |
|
], |
|
};
|
|
|