mirror of
https://github.com/CompeyDev/fxtwitter-docker.git
synced 2025-04-13 14:20:56 +01:00
Upgrade to hono v4
This commit is contained in:
parent
ad5ccfb68b
commit
beea81de75
13 changed files with 25 additions and 32 deletions
8
package-lock.json
generated
8
package-lock.json
generated
|
@ -10,7 +10,7 @@
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hono/sentry": "^1.0.1",
|
"@hono/sentry": "^1.0.1",
|
||||||
"hono": "^3.12.12"
|
"hono": "^4.2.9"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@cloudflare/workers-types": "^4.20240423.0",
|
"@cloudflare/workers-types": "^4.20240423.0",
|
||||||
|
@ -4991,9 +4991,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/hono": {
|
"node_modules/hono": {
|
||||||
"version": "3.12.12",
|
"version": "4.2.9",
|
||||||
"resolved": "https://registry.npmjs.org/hono/-/hono-3.12.12.tgz",
|
"resolved": "https://registry.npmjs.org/hono/-/hono-4.2.9.tgz",
|
||||||
"integrity": "sha512-5IAMJOXfpA5nT+K0MNjClchzz0IhBHs2Szl7WFAhrFOsbtQsYmNynFyJRg/a3IPsmCfxcrf8txUGiNShXpK5Rg==",
|
"integrity": "sha512-59FAv52UxDWUt/NlC0NzrRCjeVCThUnVlqlrKYm+k80XujBu6uJwBIa5gACKKZWobjA0MJ6Vds0I3URKf383Cw==",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16.0.0"
|
"node": ">=16.0.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,6 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hono/sentry": "^1.0.1",
|
"@hono/sentry": "^1.0.1",
|
||||||
"hono": "^3.12.12"
|
"hono": "^4.2.9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,11 +90,11 @@ export const cacheMiddleware = (): MiddlewareHandler => async (c, next) => {
|
||||||
/* We properly state our OPTIONS when asked */
|
/* We properly state our OPTIONS when asked */
|
||||||
case 'OPTIONS':
|
case 'OPTIONS':
|
||||||
c.header('allow', Constants.RESPONSE_HEADERS.allow);
|
c.header('allow', Constants.RESPONSE_HEADERS.allow);
|
||||||
|
c.body(null);
|
||||||
c.status(204);
|
c.status(204);
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
c.status(405);
|
|
||||||
if (returnAsJson) return c.json('');
|
if (returnAsJson) return c.json('');
|
||||||
return c.html('');
|
return c.html('', 405);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,6 +9,7 @@ import { renderVideo } from '../render/video';
|
||||||
import { renderInstantView } from '../render/instantview';
|
import { renderInstantView } from '../render/instantview';
|
||||||
import { constructTwitterThread } from '../providers/twitter/conversation';
|
import { constructTwitterThread } from '../providers/twitter/conversation';
|
||||||
import { Experiment, experimentCheck } from '../experiments';
|
import { Experiment, experimentCheck } from '../experiments';
|
||||||
|
import { StatusCode } from 'hono/utils/http-status';
|
||||||
|
|
||||||
export const returnError = (c: Context, error: string): Response => {
|
export const returnError = (c: Context, error: string): Response => {
|
||||||
return c.html(
|
return c.html(
|
||||||
|
@ -78,7 +79,7 @@ export const handleStatus = async (
|
||||||
|
|
||||||
/* Catch this request if it's an API response */
|
/* Catch this request if it's an API response */
|
||||||
if (flags?.api) {
|
if (flags?.api) {
|
||||||
c.status(api.code);
|
c.status(api.code as StatusCode);
|
||||||
// Add every header from Constants.API_RESPONSE_HEADERS
|
// Add every header from Constants.API_RESPONSE_HEADERS
|
||||||
for (const [header, value] of Object.entries(Constants.API_RESPONSE_HEADERS)) {
|
for (const [header, value] of Object.entries(Constants.API_RESPONSE_HEADERS)) {
|
||||||
c.header(header, value);
|
c.header(header, value);
|
||||||
|
|
|
@ -42,7 +42,7 @@ const Experiments: { [key in Experiment]: ExperimentConfig } = {
|
||||||
[Experiment.IV_FORCE_THREAD_UNROLL]: {
|
[Experiment.IV_FORCE_THREAD_UNROLL]: {
|
||||||
name: 'IV force thread unroll',
|
name: 'IV force thread unroll',
|
||||||
description: 'Force thread unroll for Telegram Instant View',
|
description: 'Force thread unroll for Telegram Instant View',
|
||||||
percentage: 0.25
|
percentage: 1
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { buildAPITwitterStatus } from './processor';
|
||||||
import { Experiment, experimentCheck } from '../../experiments';
|
import { Experiment, experimentCheck } from '../../experiments';
|
||||||
import { isGraphQLTwitterStatus } from '../../helpers/graphql';
|
import { isGraphQLTwitterStatus } from '../../helpers/graphql';
|
||||||
import { Context } from 'hono';
|
import { Context } from 'hono';
|
||||||
|
import { StatusCode } from 'hono/utils/http-status';
|
||||||
|
|
||||||
const writeDataPoint = (
|
const writeDataPoint = (
|
||||||
c: Context,
|
c: Context,
|
||||||
|
@ -579,10 +580,9 @@ export const threadAPIProvider = async (c: Context) => {
|
||||||
|
|
||||||
const processedResponse = await constructTwitterThread(id, true, c, undefined);
|
const processedResponse = await constructTwitterThread(id, true, c, undefined);
|
||||||
|
|
||||||
c.status(processedResponse.code);
|
|
||||||
// Add every header from Constants.API_RESPONSE_HEADERS
|
// Add every header from Constants.API_RESPONSE_HEADERS
|
||||||
for (const [header, value] of Object.entries(Constants.API_RESPONSE_HEADERS)) {
|
for (const [header, value] of Object.entries(Constants.API_RESPONSE_HEADERS)) {
|
||||||
c.header(header, value);
|
c.header(header, value);
|
||||||
}
|
}
|
||||||
return c.json(processedResponse);
|
return c.json(processedResponse, processedResponse.code as StatusCode);
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,7 +5,7 @@ export const linkHitRequest = async (c: Context) => {
|
||||||
const userAgent = c.req.header('User-Agent') || '';
|
const userAgent = c.req.header('User-Agent') || '';
|
||||||
|
|
||||||
if (userAgent.includes('Telegram')) {
|
if (userAgent.includes('Telegram')) {
|
||||||
c.status(403);
|
return c.text('', 403);
|
||||||
}
|
}
|
||||||
// If param `url` exists, 302 redirect to it
|
// If param `url` exists, 302 redirect to it
|
||||||
if (typeof c.req.query('url') === 'string') {
|
if (typeof c.req.query('url') === 'string') {
|
||||||
|
|
|
@ -9,11 +9,10 @@ export const api = new Hono();
|
||||||
|
|
||||||
api.use('*', async (c, next) => {
|
api.use('*', async (c, next) => {
|
||||||
if (!c.req.header('user-agent')) {
|
if (!c.req.header('user-agent')) {
|
||||||
c.status(401);
|
|
||||||
return c.json({
|
return c.json({
|
||||||
error:
|
error:
|
||||||
"You must identify yourself with a User-Agent header in order to use the FixTweet API. We recommend using a descriptive User-Agent header to identify your app, such as 'MyAwesomeBot/1.0 (+http://example.com/myawesomebot)'. We don't track or save what kinds of data you are pulling, but you may be blocked if you send too many requests from an unidentifiable user agent."
|
"You must identify yourself with a User-Agent header in order to use the FixTweet API. We recommend using a descriptive User-Agent header to identify your app, such as 'MyAwesomeBot/1.0 (+http://example.com/myawesomebot)'. We don't track or save what kinds of data you are pulling, but you may be blocked if you send too many requests from an unidentifiable user agent."
|
||||||
});
|
}, 401);
|
||||||
}
|
}
|
||||||
await next();
|
await next();
|
||||||
});
|
});
|
||||||
|
|
|
@ -28,7 +28,6 @@ export const oembed = async (c: Context) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
c.header('content-type', 'application/json');
|
c.header('content-type', 'application/json');
|
||||||
c.status(200);
|
|
||||||
/* Stringify and send it on its way! */
|
/* Stringify and send it on its way! */
|
||||||
return c.text(JSON.stringify(data));
|
return c.text(JSON.stringify(data), 200);
|
||||||
};
|
};
|
||||||
|
|
|
@ -25,12 +25,10 @@ export const setRedirectRequest = async (c: Context) => {
|
||||||
/* Check that origin either does not exist or is in our domain list */
|
/* Check that origin either does not exist or is in our domain list */
|
||||||
const origin = c.req.header('origin');
|
const origin = c.req.header('origin');
|
||||||
if (origin && !Constants.STANDARD_DOMAIN_LIST.includes(new URL(origin).hostname)) {
|
if (origin && !Constants.STANDARD_DOMAIN_LIST.includes(new URL(origin).hostname)) {
|
||||||
c.status(403);
|
|
||||||
|
|
||||||
return c.html(
|
return c.html(
|
||||||
Strings.MESSAGE_HTML.format({
|
Strings.MESSAGE_HTML.format({
|
||||||
message: `Failed to set base redirect: Your request seems to be originating from another domain, please open this up in a new tab if you are trying to set your base redirect.`
|
message: `Failed to set base redirect: Your request seems to be originating from another domain, please open this up in a new tab if you are trying to set your base redirect.`
|
||||||
})
|
}), 403
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,11 +44,10 @@ export const setRedirectRequest = async (c: Context) => {
|
||||||
'content-security-policy',
|
'content-security-policy',
|
||||||
`frame-ancestors ${Constants.STANDARD_DOMAIN_LIST.join(' ')};`
|
`frame-ancestors ${Constants.STANDARD_DOMAIN_LIST.join(' ')};`
|
||||||
);
|
);
|
||||||
c.status(200);
|
|
||||||
return c.html(
|
return c.html(
|
||||||
Strings.MESSAGE_HTML.format({
|
Strings.MESSAGE_HTML.format({
|
||||||
message: `Your base redirect has been cleared. To set one, please pass along the <code>url</code> parameter.`
|
message: `Your base redirect has been cleared. To set one, please pass along the <code>url</code> parameter.`
|
||||||
})
|
}), 200
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,11 +68,10 @@ export const setRedirectRequest = async (c: Context) => {
|
||||||
'content-security-policy',
|
'content-security-policy',
|
||||||
`frame-ancestors ${Constants.STANDARD_DOMAIN_LIST.join(' ')};`
|
`frame-ancestors ${Constants.STANDARD_DOMAIN_LIST.join(' ')};`
|
||||||
);
|
);
|
||||||
c.status(200);
|
|
||||||
return c.html(
|
return c.html(
|
||||||
Strings.MESSAGE_HTML.format({
|
Strings.MESSAGE_HTML.format({
|
||||||
message: `Your URL does not appear to be well-formed. Example: ?url=https://nitter.net`
|
message: `Your URL does not appear to be well-formed. Example: ?url=https://nitter.net`
|
||||||
})
|
}), 200
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -131,8 +131,7 @@ export const statusRequest = async (c: Context) => {
|
||||||
return statusResponse;
|
return statusResponse;
|
||||||
} else {
|
} else {
|
||||||
/* Somehow handleStatus sent us nothing. This should *never* happen, but we have a case for it. */
|
/* Somehow handleStatus sent us nothing. This should *never* happen, but we have a case for it. */
|
||||||
c.status(500);
|
return c.text(Strings.ERROR_UNKNOWN, 500);
|
||||||
return c.text(Strings.ERROR_UNKNOWN);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* A human has clicked a fxtwitter.com/:screen_name/status/:id link!
|
/* A human has clicked a fxtwitter.com/:screen_name/status/:id link!
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { Context } from 'hono';
|
||||||
import { Constants } from './constants';
|
import { Constants } from './constants';
|
||||||
import { Strings } from './strings';
|
import { Strings } from './strings';
|
||||||
import { userAPI } from './providers/twitter/profile';
|
import { userAPI } from './providers/twitter/profile';
|
||||||
|
import { StatusCode } from 'hono/utils/http-status';
|
||||||
|
|
||||||
export const returnError = (c: Context, error: string): Response => {
|
export const returnError = (c: Context, error: string): Response => {
|
||||||
return c.html(
|
return c.html(
|
||||||
|
@ -29,7 +30,7 @@ export const handleProfile = async (
|
||||||
/* Catch this request if it's an API response */
|
/* Catch this request if it's an API response */
|
||||||
// For now we just always return the API response while testing
|
// For now we just always return the API response while testing
|
||||||
if (flags?.api) {
|
if (flags?.api) {
|
||||||
c.status(api.code);
|
c.status(api.code as StatusCode);
|
||||||
// Add every header from Constants.API_RESPONSE_HEADERS
|
// Add every header from Constants.API_RESPONSE_HEADERS
|
||||||
for (const [header, value] of Object.entries(Constants.API_RESPONSE_HEADERS)) {
|
for (const [header, value] of Object.entries(Constants.API_RESPONSE_HEADERS)) {
|
||||||
c.header(header, value);
|
c.header(header, value);
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { Constants } from './constants';
|
||||||
import { api } from './realms/api/router';
|
import { api } from './realms/api/router';
|
||||||
import { twitter } from './realms/twitter/router';
|
import { twitter } from './realms/twitter/router';
|
||||||
import { cacheMiddleware } from './caches';
|
import { cacheMiddleware } from './caches';
|
||||||
|
import { StatusCode } from 'hono/utils/http-status';
|
||||||
|
|
||||||
const noCache = 'max-age=0, no-cache, no-store, must-revalidate';
|
const noCache = 'max-age=0, no-cache, no-store, must-revalidate';
|
||||||
const embeddingClientRegex =
|
const embeddingClientRegex =
|
||||||
|
@ -89,10 +90,9 @@ app.onError((err, c) => {
|
||||||
if (c.req.header('User-Agent')?.match(embeddingClientRegex)) {
|
if (c.req.header('User-Agent')?.match(embeddingClientRegex)) {
|
||||||
errorCode = 200;
|
errorCode = 200;
|
||||||
}
|
}
|
||||||
c.status(errorCode);
|
|
||||||
c.header('cache-control', noCache);
|
c.header('cache-control', noCache);
|
||||||
|
|
||||||
return c.html(Strings.ERROR_HTML);
|
return c.html(Strings.ERROR_HTML, errorCode as StatusCode);
|
||||||
});
|
});
|
||||||
|
|
||||||
const customLogger = (message: string, ...rest: string[]) => {
|
const customLogger = (message: string, ...rest: string[]) => {
|
||||||
|
@ -138,12 +138,10 @@ app.all('/error', async c => {
|
||||||
c.header('cache-control', noCache);
|
c.header('cache-control', noCache);
|
||||||
|
|
||||||
if (c.req.header('User-Agent')?.match(embeddingClientRegex)) {
|
if (c.req.header('User-Agent')?.match(embeddingClientRegex)) {
|
||||||
c.status(200);
|
return c.html(Strings.ERROR_HTML, 200);
|
||||||
return c.html(Strings.ERROR_HTML);
|
|
||||||
}
|
}
|
||||||
c.status(400);
|
|
||||||
/* We return it as a 200 so embedded applications can display the error */
|
/* We return it as a 200 so embedded applications can display the error */
|
||||||
return c.body('');
|
return c.body('', 400);
|
||||||
});
|
});
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|
Loading…
Add table
Reference in a new issue