From 59d18a13b77cb5aa28ac1b5495898bdc0ffbb18c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 20 Apr 2026 23:41:58 +0100 Subject: [PATCH] refactor: reuse text runtime in nextcloud talk --- extensions/nextcloud-talk/src/accounts.ts | 16 ++++------------ .../nextcloud-talk/src/channel.adapters.ts | 5 +---- extensions/nextcloud-talk/src/setup-core.ts | 5 +---- extensions/nextcloud-talk/src/setup-surface.ts | 9 +-------- extensions/nextcloud-talk/src/signature.ts | 5 +---- 5 files changed, 8 insertions(+), 32 deletions(-) diff --git a/extensions/nextcloud-talk/src/accounts.ts b/extensions/nextcloud-talk/src/accounts.ts index 53ac2c2157d..8bba3d5fd5b 100644 --- a/extensions/nextcloud-talk/src/accounts.ts +++ b/extensions/nextcloud-talk/src/accounts.ts @@ -6,21 +6,13 @@ import { resolveMergedAccountConfig, } from "openclaw/plugin-sdk/account-core"; import { tryReadSecretFileSync } from "openclaw/plugin-sdk/secret-file-runtime"; +import { + normalizeLowercaseStringOrEmpty, + normalizeOptionalString, +} from "openclaw/plugin-sdk/text-runtime"; import { normalizeResolvedSecretInputString } from "./secret-input.js"; import type { CoreConfig, NextcloudTalkAccountConfig } from "./types.js"; -function normalizeOptionalString(value: unknown): string | undefined { - if (typeof value !== "string") { - return undefined; - } - const trimmed = value.trim(); - return trimmed || undefined; -} - -function normalizeLowercaseStringOrEmpty(value: unknown): string { - return normalizeOptionalString(value)?.toLowerCase() ?? ""; -} - function isTruthyEnvValue(value?: string): boolean { const normalized = normalizeLowercaseStringOrEmpty(value); return normalized === "true" || normalized === "1" || normalized === "yes" || normalized === "on"; diff --git a/extensions/nextcloud-talk/src/channel.adapters.ts b/extensions/nextcloud-talk/src/channel.adapters.ts index 440937ec09d..abaec882394 100644 --- a/extensions/nextcloud-talk/src/channel.adapters.ts +++ b/extensions/nextcloud-talk/src/channel.adapters.ts @@ -5,6 +5,7 @@ import { createScopedDmSecurityResolver, } from "openclaw/plugin-sdk/channel-config-helpers"; import { createPairingPrefixStripper } from "openclaw/plugin-sdk/channel-pairing"; +import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime"; import { listNextcloudTalkAccountIds, resolveDefaultNextcloudTalkAccountId, @@ -13,10 +14,6 @@ import { } from "./accounts.js"; import type { CoreConfig } from "./types.js"; -function normalizeLowercaseStringOrEmpty(value: unknown): string { - return typeof value === "string" ? value.trim().toLowerCase() : ""; -} - export const nextcloudTalkConfigAdapter = createScopedChannelConfigAdapter< ResolvedNextcloudTalkAccount, ResolvedNextcloudTalkAccount, diff --git a/extensions/nextcloud-talk/src/setup-core.ts b/extensions/nextcloud-talk/src/setup-core.ts index 30bf537202b..9d6c535722b 100644 --- a/extensions/nextcloud-talk/src/setup-core.ts +++ b/extensions/nextcloud-talk/src/setup-core.ts @@ -14,6 +14,7 @@ import { type WizardPrompter, } from "openclaw/plugin-sdk/setup-runtime"; import { formatDocsLink } from "openclaw/plugin-sdk/setup-tools"; +import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime"; import { resolveDefaultNextcloudTalkAccountId, resolveNextcloudTalkAccount } from "./accounts.js"; import type { CoreConfig } from "./types.js"; @@ -26,10 +27,6 @@ type NextcloudSetupInput = ChannelSetupInput & { }; type NextcloudTalkSection = NonNullable["nextcloud-talk"]; -function normalizeLowercaseStringOrEmpty(value: unknown): string { - return typeof value === "string" ? value.trim().toLowerCase() : ""; -} - function addWildcardAllowFrom(allowFrom?: Array | null): string[] { return mergeAllowFromEntries(allowFrom, ["*"]); } diff --git a/extensions/nextcloud-talk/src/setup-surface.ts b/extensions/nextcloud-talk/src/setup-surface.ts index a91f9aae9a9..8d4e7ca16f0 100644 --- a/extensions/nextcloud-talk/src/setup-surface.ts +++ b/extensions/nextcloud-talk/src/setup-surface.ts @@ -6,6 +6,7 @@ import { setSetupChannelEnabled, type ChannelSetupWizard, } from "openclaw/plugin-sdk/setup"; +import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime"; import { resolveNextcloudTalkAccount } from "./accounts.js"; import { clearNextcloudTalkAccountFields, @@ -20,14 +21,6 @@ import type { CoreConfig } from "./types.js"; const channel = "nextcloud-talk" as const; const CONFIGURE_API_FLAG = "__nextcloudTalkConfigureApiCredentials"; -function normalizeOptionalString(value: unknown): string | undefined { - if (typeof value !== "string") { - return undefined; - } - const trimmed = value.trim(); - return trimmed || undefined; -} - export const nextcloudTalkSetupWizard: ChannelSetupWizard = { channel, stepOrder: "text-first", diff --git a/extensions/nextcloud-talk/src/signature.ts b/extensions/nextcloud-talk/src/signature.ts index b091bccdca4..4f84417a82c 100644 --- a/extensions/nextcloud-talk/src/signature.ts +++ b/extensions/nextcloud-talk/src/signature.ts @@ -1,14 +1,11 @@ import { createHmac, randomBytes } from "node:crypto"; +import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime"; import type { NextcloudTalkWebhookHeaders } from "./types.js"; const SIGNATURE_HEADER = "x-nextcloud-talk-signature"; const RANDOM_HEADER = "x-nextcloud-talk-random"; const BACKEND_HEADER = "x-nextcloud-talk-backend"; -function normalizeLowercaseStringOrEmpty(value: unknown): string { - return typeof value === "string" ? value.trim().toLowerCase() : ""; -} - /** * Verify the HMAC-SHA256 signature of an incoming webhook request. * Signature is calculated as: HMAC-SHA256(random + body, secret)