From a1c9912d6bf31a2c0e4a18386e687e6d448815e6 Mon Sep 17 00:00:00 2001 From: Ngakan Nyoman Ari Surya Khrisna Date: Fri, 21 Aug 2026 12:31:51 +0800 Subject: [PATCH] feat: replace channel whitelist with a blacklist * Replace the RELEASED_CHANNELS allowlist with BLOCKED_CHANNELS * add BRI_DIRECT_DEBIT to the blacklist * Add unit tests covering pass-through and blacklist-filtering behavior --- sdk/src/public-sdk.ts | 4 +- sdk/src/utils.test.ts | 29 +++++++++ sdk/src/utils.ts | 140 ++---------------------------------------- 3 files changed, 35 insertions(+), 138 deletions(-) diff --git a/sdk/src/public-sdk.ts b/sdk/src/public-sdk.ts index d282cfc..25d3f9c 100644 --- a/sdk/src/public-sdk.ts +++ b/sdk/src/public-sdk.ts @@ -84,7 +84,7 @@ import { MOCK_NETWORK_DELAY_MS, ParsedSdkKey, parseSdkKey, - removeUnreleasedChannels, + removeBlockedChannels, resolvePairedChannel, satisfiesMinMax, sleep, @@ -395,7 +395,7 @@ export class XenditComponents extends EventTarget { this[internal].sdkKey, this[internal].sdkKey.sessionAuthKey, ); - bff.channels = removeUnreleasedChannels(bff.channels); + bff.channels = removeBlockedChannels(bff.channels); } catch (error) { this[internal].behaviorTree.bb.sdkStatus = "FATAL_ERROR"; this[internal].behaviorTree.bb.sdkFatalErrorMessage = diff --git a/sdk/src/utils.test.ts b/sdk/src/utils.test.ts index 1d11e10..c57c857 100644 --- a/sdk/src/utils.test.ts +++ b/sdk/src/utils.test.ts @@ -2,6 +2,7 @@ import { BffAction } from "./backend-types/payment-entity"; import { makeTestBffData } from "./data/test-data"; import { assert, + BLOCKED_CHANNELS, camelCaseToKebabCase, cancellableSleep, errorToString, @@ -12,6 +13,7 @@ import { randomBits, randomHexString, randomUUID, + removeBlockedChannels, resolvePairedChannel, satisfiesMinMax, SLEEP_MULTIPLIER, @@ -143,6 +145,33 @@ describe("utils - resolvePairedChannel", () => { }); }); +describe("utils - removeBlockedChannels", () => { + it("should pass through channels that are not in the blacklist", () => { + const channels = makeTestBffData().channels; + expect(removeBlockedChannels(channels)).toEqual(channels); + }); + + it("should filter out channels present in the blacklist", () => { + const channels = makeTestBffData().channels; + const blockedCode = channels[0].channel_code; + const previousValue = BLOCKED_CHANNELS[blockedCode]; + BLOCKED_CHANNELS[blockedCode] = true; + try { + const result = removeBlockedChannels(channels); + expect( + result.find((ch) => ch.channel_code === blockedCode), + ).toBeUndefined(); + expect(result.length).toBe(channels.length - 1); + } finally { + if (previousValue === undefined) { + delete BLOCKED_CHANNELS[blockedCode]; + } else { + BLOCKED_CHANNELS[blockedCode] = previousValue; + } + } + }); +}); + describe("utils - satisfiesMinMax", () => { it("should validate min and max values", () => { const channel = makeTestBffData().channels.find( diff --git a/sdk/src/utils.ts b/sdk/src/utils.ts index a1f79c4..cbfe3a5 100644 --- a/sdk/src/utils.ts +++ b/sdk/src/utils.ts @@ -514,145 +514,13 @@ export function lockDownInteralProperty(obj: { [internal]: unknown }) { }); } -const RELEASED_CHANNELS: Record = { - AFFIN_FPX: true, - AFFIN_FPX_BUSINESS: true, - AGRO_FPX: true, - AGRO_FPX_BUSINESS: true, - ALIPAY: true, - ALLIANCE_FPX: true, - ALLIANCE_FPX_BUSINESS: true, - AMBANK_FPX: true, - AMBANK_FPX_BUSINESS: true, - APPOTA: true, - ASTRAPAY: true, - BAY_CARD_INSTALLMENT: true, - BAY_GBW_DIRECT_DEBIT: true, - BAY_GBW_MOBILE_BANKING: true, - BBL_CARD_INSTALLMENT: true, - BBL_DIRECT_DEBIT: true, - BBL_GBW_DIRECT_DEBIT: true, - BBL_GBW_MOBILE_BANKING: true, - BBL_MOBILE_BANKING: true, - BDO_DIRECT_DEBIT: true, - BDO_EPAY: true, - BDO_ONLINE_BANKING: true, - BNP_FPX_BUSINESS: true, - BOC_FPX: true, - BOC_ONLINE_BANKING: true, - BPI_DIRECT_DEBIT: true, - BPI_ONLINE_BANKING: true, - BPI_RECURRING: true, - BSN_FPX: true, - CARDS: true, - CHINABANK_DIRECT_DEBIT: true, - CHINABANK_ONLINE_BANKING: true, - CIMB_DIRECT_DEBIT: true, - CIMB_FPX: true, - CIMB_FPX_BUSINESS: true, - CITIBANK_FPX_BUSINESS: true, - DANA: true, - DEUTSCHE_FPX_BUSINESS: true, - DUITNOW_PAY: true, - GCASH: true, - GCASH_LINK_AND_PAY: true, - GOPAY: true, - GOPAY_RECURRING: true, - GRABPAY: true, - HLB_FPX: true, - HLB_FPX_BUSINESS: true, - HSBC_FPX: true, - HSBC_FPX_BUSINESS: true, - INSTAPAY_ONLINE_BANKING: true, - ISLAM_FPX: true, - ISLAM_FPX_BUSINESS: true, - JENIUSPAY: true, - KBANK_CARD_INSTALLMENT: true, - KBANK_GBW_MOBILE_BANKING: true, - KBANK_MOBILE_BANKING: true, - KFH_FPX: true, - KFH_FPX_BUSINESS: true, - KRUNGSRI_DIRECT_DEBIT: true, - KRUNGSRI_MOBILE_BANKING: true, - KTB_CARD_INSTALLMENT: true, - KTB_DIRECT_DEBIT: true, - KTB_GBW_DIRECT_DEBIT: true, - KTB_GBW_MOBILE_BANKING: true, - KTB_MOBILE_BANKING: true, - LANDBANK_ONLINE_BANKING: true, - LINEPAY: true, - LINKAJA: true, - MANDIRI_DIRECT_DEBIT: true, - MAYB2E_FPX: true, - MAYB2E_FPX_BUSINESS: true, - MAYB2U_FPX: true, - MAYBANK_ONLINE_BANKING: true, - METROBANK_ONLINE_BANKING: true, - MOMO: true, - MUAMALAT_FPX: true, - MUAMALAT_FPX_BUSINESS: true, - NEXCASH: true, - OCBC_FPX: true, - OCBC_FPX_BUSINESS: true, - OVO: true, - PAYMAYA: true, - PESONET_ONLINE_BANKING: true, - PNB_ONLINE_BANKING: true, - PROMPTPAY: true, - PSBANK_ONLINE_BANKING: true, - PUBLIC_FPX: true, - PUBLIC_FPX_BUSINESS: true, - QR_PH: true, - QRIS: true, - RAKYAT_FPX: true, - RAKYAT_FPX_BUSINESS: true, - RCBC_DIRECT_DEBIT: true, - RCBC_ONLINE_BANKING: true, - RHB_FPX: true, - RHB_FPX_BUSINESS: true, - ROBINSONS_BANK_ONLINE_BANKING: true, - SCB_CARD_INSTALLMENT: true, - SCB_DIRECT_DEBIT: true, - SCB_GBW_DIRECT_DEBIT: true, - SCB_GBW_MOBILE_BANKING: true, - SCB_MOBILE_BANKING: true, - SCH_FPX: true, - SCH_FPX_BUSINESS: true, - SECURITY_BANK_ONLINE_BANKING: true, - SGQR: true, - SHOPEEPAY: true, - TOUCHNGO: true, - TRUEMONEY: true, - TTB_CARD_INSTALLMENT: true, - UBP_DIRECT_DEBIT: true, - UBP_EADA: true, - UNIONBANK_ONLINE_BANKING: true, - UOB_FPX: true, - UOB_FPX_BUSINESS: true, - VIETTELPAY: true, - VNPTWALLET: true, - WECHATPAY: true, - ZALOPAY: true, - // OTC - "7ELEVEN": true, - "7ELEVEN_CLIQQ": true, - CEBUANA: true, - ECPAY: true, - PALAWAN: true, - MLHUILLIER: true, - ECPAY_DRAGONLOAN: true, - LBC: true, - ECPAY_SCHOOL: true, - USSC: true, - SM_BILLS_PAYMENT: true, - ROBINSONS_BILLS_PAYMENT: true, - ALFAMART: true, - INDOMARET: true, +export const BLOCKED_CHANNELS: Record = { + BRI_DIRECT_DEBIT: true, }; // filter out channels not supported by this SDK version -export function removeUnreleasedChannels(channels: BffChannel[]): BffChannel[] { - return channels.filter((channel) => RELEASED_CHANNELS[channel.channel_code]); +export function removeBlockedChannels(channels: BffChannel[]): BffChannel[] { + return channels.filter((channel) => !BLOCKED_CHANNELS[channel.channel_code]); } /**