Skip to content

Commit 656aa2c

Browse files
authored
Release v1.54.4 (#1273)
chore: show exact date and time of execution fix: elevated Telegram ETIMEDOUT during tcp.connect fix: executions page crashes when it cannot find iconUrl fix: purge nbsp and invalid characters from all inputs
2 parents 9570cbb + fe9fc10 commit 656aa2c

File tree

25 files changed

+96
-36
lines changed

25 files changed

+96
-36
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,5 +111,5 @@
111111
"tsconfig-paths": "^4.2.0",
112112
"type-fest": "4.10.3"
113113
},
114-
"version": "1.54.3"
114+
"version": "1.54.4"
115115
}

packages/backend/src/apps/telegram-bot/actions/send-message/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { IRawAction } from '@plumber/types'
22

33
import StepError from '@/errors/step'
4+
import logger from '@/helpers/logger'
45

56
import { escapeMarkdown, sanitizeMarkdown } from '../../common/markdown-v1'
67
import { throwSendMessageError } from '../../common/throw-errors'
@@ -88,6 +89,10 @@ const action: IRawAction = {
8889
}
8990
try {
9091
const response = await $.http.post('/sendMessage', payload)
92+
// logging for debugging
93+
logger.info(
94+
`Telegram ip success: ${response.request?.socket?.remoteAddress}`,
95+
)
9196
$.setActionItem({
9297
raw: response.data,
9398
})
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { TBeforeRequest } from '@plumber/types'
2+
3+
import https from 'https'
4+
5+
// Singleton HTTPS agent configured for IPv4 only
6+
// This helps avoid DNS timeout issues with Telegram's API
7+
const httpsAgent = new https.Agent({
8+
family: 4, // Force IPv4 resolution
9+
keepAlive: true,
10+
timeout: 30000, // 30 second timeout
11+
})
12+
13+
const forceIpv4: TBeforeRequest = async ($, requestConfig) => {
14+
// Only apply to HTTPS requests (Telegram API uses HTTPS)
15+
if (requestConfig.baseURL?.startsWith('https://')) {
16+
requestConfig.httpsAgent = httpsAgent
17+
}
18+
19+
return requestConfig
20+
}
21+
22+
export default forceIpv4

packages/backend/src/apps/telegram-bot/common/throw-errors.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export async function throwSendMessageError(
2626
err.message.includes('ETIMEDOUT') ||
2727
err.code === 'ETIMEDOUT'
2828
) {
29+
logger.error(`Telegram ip error: ${err.resolvedIp}`)
2930
throw new RetriableError({
3031
error: 'Timeout error. Telegram may be experiencing issues.',
3132
delayInMs: 'default',

packages/backend/src/apps/telegram-bot/dynamic-data/get-chat-ids.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import {
44
IGlobalVariable,
55
} from '@plumber/types'
66

7+
import logger from '@/helpers/logger'
8+
79
import {
810
HasTelegramChat,
911
TelegramGetUpdatesResponse,
@@ -49,9 +51,11 @@ const dynamicData: IDynamicData = {
4951
const chatIdsMap: { name: string; value: string }[] = []
5052
const chatIdsSet = new Set<number>()
5153
try {
52-
const { data } = await $.http.get<TelegramGetUpdatesResponse>(
54+
const { data, request } = await $.http.get<TelegramGetUpdatesResponse>(
5355
getUpdatesApi,
5456
)
57+
// logging for debugging
58+
logger.info(`Telegram ip success: ${request?.socket?.remoteAddress}`)
5559

5660
if (!data.result) {
5761
return {

packages/backend/src/apps/telegram-bot/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { IApp } from '@plumber/types'
33
import { getGenericAppQueue } from '@/queues/helpers/get-generic-app-queue'
44

55
import addAuthHeader from './common/add-auth-header'
6+
import forceIpv4 from './common/force-ipv4'
67
import rateLimitHandler from './common/interceptor/rate-limit'
78
import actions from './actions'
89
import auth from './auth'
@@ -17,7 +18,7 @@ const app: IApp = {
1718
baseUrl: 'https://telegram.org',
1819
apiBaseUrl: 'https://api.telegram.org',
1920
primaryColor: '2AABEE',
20-
beforeRequest: [addAuthHeader],
21+
beforeRequest: [forceIpv4, addAuthHeader],
2122
requestErrorHandler: rateLimitHandler,
2223
dynamicData,
2324
auth,

packages/backend/src/errors/http.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import BaseError from './base'
77
export default class HttpError extends BaseError {
88
response: AxiosResponse
99
code?: string
10+
resolvedIp?: string
1011

1112
constructor(error: AxiosError) {
1213
const computedError =
@@ -26,6 +27,9 @@ export default class HttpError extends BaseError {
2627
// Pass code along
2728
this.code = error.code
2829

30+
// add resolved ip for debugging
31+
this.resolvedIp = error.request?.socket?.remoteAddress
32+
2933
//
3034
// Only preserve selected headers to avoid storing sensitive data.
3135
//

packages/frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "frontend",
3-
"version": "1.54.3",
3+
"version": "1.54.4",
44
"type": "module",
55
"scripts": {
66
"dev": "wait-on tcp:3000 && vite --host --force",

packages/frontend/src/components/ControlledAutocomplete/AddNewOptionModal.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
} from '@chakra-ui/react'
1414
import { Button, FormLabel, Input } from '@opengovsg/design-system-react'
1515

16+
import { removeProblematicWhitespace } from '@/components/RichTextEditor/utils'
1617
import client from '@/graphql/client'
1718
import { CREATE_TABLE } from '@/graphql/mutations/tiles/create-table'
1819
import { UPDATE_TABLE } from '@/graphql/mutations/tiles/update-table'
@@ -129,7 +130,9 @@ function AddNewOptionalModal({
129130
<FormLabel isRequired>Name your tile</FormLabel>
130131
<Input
131132
autoFocus
132-
onChange={(e) => setInputValue(e.target.value)}
133+
onChange={(e) =>
134+
setInputValue(removeProblematicWhitespace(e.target.value))
135+
}
133136
value={inputValue}
134137
/>
135138
<Button

0 commit comments

Comments
 (0)