diff --git a/README.md b/README.md index d4cd6e06..b5740d88 100644 --- a/README.md +++ b/README.md @@ -2834,3 +2834,19 @@ Campaign analytics shows `Skipped by frequency cap`; recipient output includes This implementation keeps the published SDK pin unchanged. Release waits for a matching SDK prerelease and accepted API contract; source support does not imply package publication or beta availability. + +## Guest participants and waiting rooms (unreleased) + +Call participant output preserves optional `guest` and `name` fields. A name is unverified display text; the public participant ID remains the identity used for controls. A phone number is optional. + +`calls media --control-input commands.jsonl` reads explicit host commands on the same media connection. Use a file or pipe separate from PCM input; `--control-input -` reads stdin when `--input` does not use stdin. Each nonblank line is one command: + +```json +{"action":"set_approval_required","enabled":true} +{"action":"admit","participantId":"739182640518203"} +{"action":"deny","participantId":"739182640518204"} +``` + +The command reports waiting-room state and matching results to stderr, as JSON lines with `--json`. It never opens another connection to impersonate the host or retries an uncertain command. Check the current roster before deciding to send another action after `waiting_room_control_unknown`. Rendered names are quoted so control characters cannot become terminal instructions. + +This source requires a Calls SDK that implements waiting-room controls. The pinned published SDK does not yet provide them, so the flag fails before connecting in ordinary builds. Physical-package acceptance uses the exact candidate SDK recorded in `contracts/calls-guests.candidate.json`; it is not registry or deployed API acceptance. Do not publish this counterpart until the matching SDK and API have the required environment acceptance. diff --git a/contracts/calls-guests.candidate.json b/contracts/calls-guests.candidate.json new file mode 100644 index 00000000..6cf11cbf --- /dev/null +++ b/contracts/calls-guests.candidate.json @@ -0,0 +1,27 @@ +{ + "sourceAccepted": false, + "published": false, + "apiVersion": "2026-09-22", + "apiSource": "0983e9263de1f0887b249faf9d85207d543989e3", + "sdkSource": "e6df859b2560c67a87f947f8c4cf13e2361cfc95", + "sdkSnippetExport": "b9454930a2a821cccde2881efeb4430a0a96e676", + "physicalPackageSha256": "34b858821df0405c215306997a3e3cfdbea1cf404db90c09422be4075018cda4", + "publishedDependencyUnchanged": true, + "operations": ["set_approval_required", "admit", "deny"], + "authority": "same held live media connection; backend checks call owner and current provider admin", + "replay": "never automatic; a matching acknowledgement is required", + "evidence": "POLYMORFA_GUEST_SDK_REQUIRED=1 native CLI calls-sockets fixture with candidate package", + "releaseGates": [ + "accepted API and SDK source", + "matching staging acceptance before nightly", + "matching production acceptance before stable", + "native paired-host waiting-room moderation acceptance", + "matching published SDK version before dependency pin", + "CLI merge and publication after the matching SDK dependency is pinned" + ], + "acceptance": { + "publishedDependency": "format, lint, typecheck, build, reference checks and full suite pass: 1175 tests, 1 candidate-only skip; old SDK refuses unsupported controls before connecting", + "candidatePackage": "typecheck, build and all 1176 tests pass with physical SDK archive, including native held-connection guest moderation; emitted browser module and production audit pass", + "dependencyPin": "published version unchanged until matching SDK publication and API environment acceptance; full candidate source compatibility is verified" + } +} diff --git a/contracts/cli-reference.json b/contracts/cli-reference.json index 432e7abe..0a46faaf 100644 --- a/contracts/cli-reference.json +++ b/contracts/cli-reference.json @@ -12613,6 +12613,18 @@ "env": null, "helpGroup": "GLOBAL" }, + { + "name": "control-input", + "char": null, + "type": "option", + "required": false, + "multiple": false, + "default": null, + "options": [], + "description": "Read waiting-room commands as JSON lines from a file or - for stdin, on this live connection. Requires a Calls SDK with waiting-room support.", + "env": null, + "helpGroup": null + }, { "name": "exclusive", "char": null, diff --git a/scripts/verify-browser.mjs b/scripts/verify-browser.mjs index 500db3e7..4415232f 100644 --- a/scripts/verify-browser.mjs +++ b/scripts/verify-browser.mjs @@ -97,7 +97,10 @@ const sent = await actual.runCommand( 'Hello from Polymorfa', ], { - env: {POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_' + 'fixture'.repeat(6)}, + env: { + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_Zml4dHVyZWZpeHR1cmVmaXh0dXJlZml4dHVyZWZpeHR1cmVmaXh0dXJl', + }, fetch: async (input, init = {}) => { requests.push({ path: new URL(String(input)).pathname, diff --git a/src/commands/calls/media.ts b/src/commands/calls/media.ts index 2bf38f99..0781e8d2 100644 --- a/src/commands/calls/media.ts +++ b/src/commands/calls/media.ts @@ -1,8 +1,12 @@ -import {assertCallMediaMuteSupported} from '../../services/call-media-controls.js' +import { + assertCallMediaMuteSupported, + assertWaitingRoomSupported, +} from '../../services/call-media-controls.js' import {createWriteStream, type ReadStream, type WriteStream} from 'node:fs' import {open, stat} from 'node:fs/promises' import {once} from 'node:events' import {resolve} from 'node:path' +import type {Readable} from 'node:stream' import {Args, Flags} from '@oclif/core' import {PolymorfaConfigurationError} from '@polymorfa/sdk' @@ -37,6 +41,10 @@ export default class CallsMedia extends BaseCommand { ] static override flags = { + 'control-input': Flags.string({ + description: + 'Read waiting-room commands as JSON lines from a file or - for stdin, on this live connection. Requires a Calls SDK with waiting-room support.', + }), muted: Flags.boolean({ exclusive: ['input'], description: @@ -81,6 +89,27 @@ export default class CallsMedia extends BaseCommand { async run(): Promise { const {args, flags} = await this.parse(CallsMedia) if (flags.muted) assertCallMediaMuteSupported() + if (flags['control-input'] !== undefined) assertWaitingRoomSupported() + if ( + flags['control-input'] === '-' && + (flags.input === '-' || process.stdin.isTTY) + ) { + throw new PolymorfaConfigurationError( + 'Pipe JSON lines to --control-input - separately from PCM input.', + 'control-input', + ) + } + if ( + flags['control-input'] && + flags['control-input'] !== '-' && + flags.output !== '-' && + (await sameFile(flags['control-input'], flags.output)) + ) { + throw new PolymorfaConfigurationError( + '--control-input and --output name the same file.', + 'control-input', + ) + } if (flags.output === '-' && process.stdout.isTTY) { throw new PolymorfaConfigurationError( 'Received audio is binary. Redirect standard output or pass --output .', @@ -119,6 +148,18 @@ export default class CallsMedia extends BaseCommand { throw inputFailed(inputPath, error) } } + let controls: Readable | undefined + if (flags['control-input'] !== undefined) { + try { + controls = + flags['control-input'] === '-' + ? process.stdin + : (await open(flags['control-input'], 'r')).createReadStream() + } catch (error) { + inputFile?.destroy() + throw inputFailed(flags['control-input'], error) + } + } const json = this.outputMode(flags) === 'json' const quiet = this.outputMode(flags) === 'quiet' const report = (value: object, human: string): void => { @@ -158,6 +199,7 @@ export default class CallsMedia extends BaseCommand { halt.abort() } input?.on('error', onInputError) + controls?.on('error', onInputError) // Flush and close the output file once; its errors arrive asynchronously. let outputClosed = false @@ -177,6 +219,7 @@ export default class CallsMedia extends BaseCommand { exclusive: flags.exclusive, muted: flags.muted, input, + controls, leaveOnEnd: flags['leave-on-eof'], output, participant: flags.participant, @@ -202,6 +245,8 @@ export default class CallsMedia extends BaseCommand { // it (a microphone, tail -f), which would keep the process alive. if (input === process.stdin) process.stdin.destroy() input?.off('error', onInputError) + controls?.destroy() + controls?.off('error', onInputError) await closeOutput() } if (fileError !== undefined) throw outputFailed(flags.output, fileError) @@ -222,6 +267,8 @@ function renderMediaStatus( return `Connected to call ${status.callId} as connection ${status.connectionId} at ${status.sampleRate} Hz.` case 'placed': return `Placed call ${status.callId}; waiting for an answer.` + case 'waiting_room_control_result': + return `Waiting-room command ${status.sequence} (${status.action}): ${status.ok ? 'confirmed' : (status.code ?? 'failed')}.` case 'input_ended': return `Sent all input audio (${status.bytes} bytes).` default: diff --git a/src/listener/forwarding.ts b/src/listener/forwarding.ts index 3ece93bd..457d6c0e 100644 --- a/src/listener/forwarding.ts +++ b/src/listener/forwarding.ts @@ -322,7 +322,9 @@ function send( path: `${destination.url.pathname}${destination.url.search}`, port: destination.url.port || undefined, rejectUnauthorized: !(input.skipVerify && destination.loopback), - servername: hostname(destination.url), + servername: isIP(hostname(destination.url)) + ? '' + : hostname(destination.url), signal: input.signal, timeout: 10_000, }, diff --git a/src/output/calls.ts b/src/output/calls.ts index f5a3ef0a..79ded56e 100644 --- a/src/output/calls.ts +++ b/src/output/calls.ts @@ -58,12 +58,26 @@ export function renderCallActivity(activity: CallActivity): string { `participant=${activity.participant.id}`, `state=${activity.participant.state}`, ) + if ((activity.participant as {guest?: boolean}).guest === true) + fields.push('guest=true') + if (typeof (activity.participant as {name?: string}).name === 'string') + fields.push( + `name=${JSON.stringify((activity.participant as {name?: string}).name)}`, + ) break case 'participant_left': fields.push(`participant=${activity.participantId}`) if (activity.reason !== undefined) fields.push(`reason=${activity.reason}`) break + case 'waiting_room': + fields.push( + `approvalRequired=${activity.room.enabled}`, + `isAdmin=${activity.room.isAdmin}`, + `inWaitingRoom=${activity.room.inWaitingRoom}`, + `users=${JSON.stringify(activity.room.users)}`, + ) + break case 'ended': fields.push(`reason=${activity.reason}`, `duration=${activity.duration}s`) break diff --git a/src/services/call-media-controls.ts b/src/services/call-media-controls.ts index 6c7259de..8e6b1158 100644 --- a/src/services/call-media-controls.ts +++ b/src/services/call-media-controls.ts @@ -30,3 +30,123 @@ export async function muteCallMedia(call: object): Promise { ) } } + +export interface WaitingRoomCommand { + readonly action: 'set_approval_required' | 'admit' | 'deny' + readonly enabled?: boolean + readonly participantId?: string +} +interface WaitingRoomControls { + setApprovalRequired(enabled: boolean): Promise + admitParticipant(participantId: string): Promise + denyParticipant(participantId: string): Promise +} + +export function assertWaitingRoomSupported( + candidate: object = Call.prototype, +): asserts candidate is WaitingRoomControls { + const controls = candidate as Partial + if ( + typeof controls.setApprovalRequired !== 'function' || + typeof controls.admitParticipant !== 'function' || + typeof controls.denyParticipant !== 'function' + ) { + throw new PolymorfaConfigurationError( + 'This CLI build needs a published Calls SDK with waiting-room support before --control-input can be used.', + 'control-input', + ) + } +} + +/** One command uses only the Call's current media connection. Never retry it. */ +export async function moderateWaitingRoom( + call: object, + command: WaitingRoomCommand, +): Promise { + assertWaitingRoomSupported(call) + if (command.action === 'set_approval_required') + await call.setApprovalRequired(command.enabled!) + else if (command.action === 'admit') + await call.admitParticipant(command.participantId!) + else await call.denyParticipant(command.participantId!) +} + +/** Read bounded UTF-8 JSON lines from a file or pipe, separate from PCM input. */ +export async function* waitingRoomCommands( + input: AsyncIterable, +): AsyncGenerator { + const decoder = new TextDecoder('utf-8', {fatal: true}) + let pending = '' + function parse(line: string): WaitingRoomCommand { + let value: unknown + try { + value = JSON.parse(line) + } catch { + throw invalidControl() + } + if (!value || typeof value !== 'object' || Array.isArray(value)) + throw invalidControl() + const command = value as Record + const keys = Object.keys(command).sort().join(',') + if ( + command.action === 'set_approval_required' && + keys === 'action,enabled' && + typeof command.enabled === 'boolean' + ) + return {action: command.action, enabled: command.enabled} + if ( + (command.action === 'admit' || command.action === 'deny') && + keys === 'action,participantId' && + typeof command.participantId === 'string' && + /^[1-9][0-9]{0,18}$/.test(command.participantId) + ) + return {action: command.action, participantId: command.participantId} + throw invalidControl() + } + for await (const chunk of input) { + // Process pieces so one large read never grows the pending line without bound. + for (let offset = 0; offset < chunk.length; offset += 1024) { + pending += decoder.decode(chunk.subarray(offset, offset + 1024), { + stream: true, + }) + let newline: number + while ((newline = pending.indexOf('\n')) !== -1) { + const line = pending.slice(0, newline).trim() + if (newline > 4096) throw invalidControl() + pending = pending.slice(newline + 1) + if (line) yield parse(line) + } + if (pending.length > 4096) throw invalidControl() + } + } + pending += decoder.decode() + if (pending.trim()) yield parse(pending.trim()) +} +function invalidControl(): PolymorfaConfigurationError { + return new PolymorfaConfigurationError( + 'Expected a JSON line with action set_approval_required and enabled, or action admit/deny and a public participantId. Lines must be at most 4096 characters.', + 'control-input', + ) +} + +export interface CallWaitingRoom { + readonly enabled: boolean + readonly isAdmin: boolean + readonly inWaitingRoom: boolean + readonly users: readonly { + readonly id: string + readonly state: string + readonly guest?: boolean + readonly name?: string + }[] +} +export function observeWaitingRoom( + call: object, + listener: (state: CallWaitingRoom) => void, +): void { + ;( + call as { + on(event: 'waitingRoom', listener: (state: CallWaitingRoom) => void): void + } + ).on('waitingRoom', listener) +} diff --git a/src/services/calls.ts b/src/services/calls.ts index 0c65b5df..4dcf44b5 100644 --- a/src/services/calls.ts +++ b/src/services/calls.ts @@ -1,6 +1,11 @@ import { assertCallMediaMuteSupported, muteCallMedia, + assertWaitingRoomSupported, + moderateWaitingRoom, + waitingRoomCommands, + observeWaitingRoom, + type CallWaitingRoom, } from './call-media-controls.js' import {randomBytes} from 'node:crypto' @@ -653,6 +658,12 @@ export function renderCallParticipant(participant: VoipParticipant): string { participant.username === undefined ? undefined : `Username\t${participant.username}`, + (participant as VoipParticipant & {guest?: boolean}).guest === true + ? 'Guest\tYes' + : undefined, + typeof (participant as VoipParticipant & {name?: string}).name === 'string' + ? `Name\t${JSON.stringify((participant as VoipParticipant & {name?: string}).name)}` + : undefined, `State\t${participant.state}`, ] .filter((value): value is string => value !== undefined) @@ -897,6 +908,11 @@ export type CallActivity = readonly participantId: string readonly reason?: string } + | { + readonly type: 'waiting_room' + readonly callId: string + readonly room: CallWaitingRoom + } | { readonly type: 'ended' readonly callId: string @@ -914,6 +930,9 @@ function followCall( call: Call, activity: (activity: CallActivity) => void, ): void { + observeWaitingRoom(call, (room) => + activity({type: 'waiting_room', callId: call.id, room}), + ) call.on('claim', (claim) => activity({type: 'claim', callId: call.id, ...claim}), ) @@ -1041,6 +1060,8 @@ export async function watchCalls( } export interface CallMediaInput extends CallsClientInput { + /** Explicit JSONL controls sent on this connection only, once it connects. */ + readonly controls?: AsyncIterable | undefined readonly muted?: boolean | undefined /** Answer this inbound call; without it, the next inbound call. */ readonly callId?: string | undefined @@ -1068,6 +1089,13 @@ export type CallMediaStatus = } | {readonly type: 'placed'; readonly callId: string} | {readonly type: 'input_ended'; readonly bytes: number} + | { + readonly type: 'waiting_room_control_result' + readonly sequence: number + readonly action: string + readonly ok: boolean + readonly code?: string + } export interface CallMediaSummary { readonly bytesReceived: number @@ -1103,6 +1131,7 @@ export async function bridgeCallMedia( input.place === undefined ? undefined : validateCallTarget(input.place) if (input.callId !== undefined) validateCallId(input.callId) if (input.muted === true) assertCallMediaMuteSupported() + if (input.controls !== undefined) assertWaitingRoomSupported() const client = createCallsClient(input, 'Carrying call media') let bytesReceived = 0 @@ -1209,6 +1238,41 @@ export async function bridgeCallMedia( connectionId: call.connectionId, sampleRate: call.audio.sampleRate, }) + if (input.controls !== undefined) { + const runControls = async (): Promise => { + let sequence = 0 + for await (const command of waitingRoomCommands(input.controls!)) { + if (finished || call.ended) return + sequence += 1 + try { + await moderateWaitingRoom(call, command) + status({ + type: 'waiting_room_control_result', + sequence, + action: command.action, + ok: true, + }) + } catch (error) { + // An uncertain command stays uncertain. The next line is a new user command. + const code = + error instanceof CallsError && + /^[a-z_]{1,80}$/.test(error.code) + ? error.code + : 'waiting_room_control_failed' + status({ + type: 'waiting_room_control_result', + sequence, + action: command.action, + ok: false, + code, + }) + } + } + } + void runControls().catch((error: unknown) => + finish(callsClientError(error)), + ) + } if (input.input === undefined) return pacePcm({ input: input.input, diff --git a/src/services/campaigns.ts b/src/services/campaigns.ts index 58ec7bad..ea1f777c 100644 --- a/src/services/campaigns.ts +++ b/src/services/campaigns.ts @@ -144,7 +144,9 @@ export async function listCampaignRecipients( client: MessagingClient, projectSlug: string, campaignId: string, - params: ListCampaignRecipientsParams & {readonly reason?: string}, + params: Omit & { + readonly reason?: string + }, ): Promise> { const response = await client.raw.request<{ data: readonly CampaignRecipient[] diff --git a/test/browser/run.test.ts b/test/browser/run.test.ts index d81b078a..8e14cc41 100644 --- a/test/browser/run.test.ts +++ b/test/browser/run.test.ts @@ -14,10 +14,10 @@ import {EventEmitter as BrowserEmitter} from '../../src/browser/stubs/events.js' import {process as browserProcess} from '../../src/browser/stubs/process.js' import * as browserPath from '../../src/browser/stubs/path.js' -// A client token fixture: the SDK checks only the prefix of client tokens. -const CLIENT_TOKEN = `pmfa_ct_${'fixture'.repeat(6)}` +// A synthetic client token with canonical unpadded base64url. Not a real token. +const CLIENT_TOKEN = `pmfa_ct_Zml4dHVyZWZpeHR1cmVmaXh0dXJlZml4dHVyZWZpeHR1cmVmaXh0dXJl` // A well-formed team key fixture for Platform commands. Not a real key. -const API_KEY = `pmfa_${'A'.repeat(72)}` +const API_KEY = `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0` const PROJECT = '11111111-1111-4111-8111-111111111111' /** diff --git a/test/commands/analytics.test.ts b/test/commands/analytics.test.ts index 616f73a3..fdfaf354 100644 --- a/test/commands/analytics.test.ts +++ b/test/commands/analytics.test.ts @@ -35,7 +35,7 @@ test('runs the JSON analytics command against the project-confined public route' POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', POLYMORFA_BASE_URL: server.baseUrl, }, () => @@ -69,7 +69,7 @@ test('rejects an invalid range before making a request', async () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, @@ -121,7 +121,7 @@ test('shows call vitals when messaging measurements are unavailable', async () = const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, @@ -137,7 +137,7 @@ test('shows call vitals when messaging measurements are unavailable', async () = const json = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, @@ -166,7 +166,7 @@ test('exports raw collector text through the project-confined SDK transport', as POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', POLYMORFA_BASE_URL: server.baseUrl, }, () => @@ -200,7 +200,7 @@ test('rejects an HTML response instead of printing it as collector data', async const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, diff --git a/test/commands/api-gh.test.ts b/test/commands/api-gh.test.ts index 361800de..48e65a2d 100644 --- a/test/commands/api-gh.test.ts +++ b/test/commands/api-gh.test.ts @@ -9,7 +9,7 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' describe('api gh-style options', () => { let server: TestHttpServer | undefined diff --git a/test/commands/api.test.ts b/test/commands/api.test.ts index a0237750..471c418a 100644 --- a/test/commands/api.test.ts +++ b/test/commands/api.test.ts @@ -17,7 +17,7 @@ describe('api', () => { test('sends raw Messaging requests with a project token', async () => { server = await startHttpServer({body: {success: true, data: {ready: true}}}) - const projectToken = `pmfa_pt_${'A'.repeat(94)}` + const projectToken = `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg` const result = await withEnvironment( { POLYMORFA_API_KEY: undefined, @@ -38,9 +38,9 @@ describe('api', () => { server = await startHttpServer({body: {success: true}}) const result = await withEnvironment( { - POLYMORFA_API_KEY: `pmfa_${'A'.repeat(72)}`, + POLYMORFA_API_KEY: `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0`, POLYMORFA_CLIENT_TOKEN: undefined, - POLYMORFA_PROJECT_TOKEN: `pmfa_pt_${'A'.repeat(94)}`, + POLYMORFA_PROJECT_TOKEN: `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg`, POLYMORFA_BASE_URL: server.baseUrl, }, () => runCommand('api /messaging/health --surface messaging --json'), @@ -57,7 +57,9 @@ describe('api', () => { const previousDirectory = process.cwd() const keyring = vi .spyOn(AsyncEntry.prototype, 'getPassword') - .mockResolvedValue(`pmfa_pt_${'A'.repeat(94)}`) + .mockResolvedValue( + `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg`, + ) tempDirectories.push(directory) try { await mkdir(configDirectory) @@ -125,7 +127,7 @@ describe('api', () => { process.chdir(directory) const result = await withEnvironment( { - POLYMORFA_API_KEY: `pmfa_${'A'.repeat(72)}`, + POLYMORFA_API_KEY: `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0`, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, @@ -146,7 +148,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -178,7 +180,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -219,7 +221,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -239,7 +241,7 @@ describe('api', () => { url: '/v1/projects', }) expect(server.requests[0]?.headers.authorization).toBe( - 'Bearer pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'Bearer pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', ) }) @@ -252,7 +254,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -282,7 +284,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -310,7 +312,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -332,7 +334,7 @@ describe('api', () => { server = await startHttpServer({ body: { error: - 'Invalid API key pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.', + 'Invalid API key pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0.', }, headers: {'request-id': 'req_auth'}, status: 401, @@ -341,7 +343,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -361,7 +363,7 @@ describe('api', () => { schemaVersion: 1, }) expect(result.stderr).not.toContain( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', ) expect(result.stdout).toBe('') }) @@ -372,7 +374,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -396,7 +398,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -424,7 +426,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -458,7 +460,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -476,7 +478,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -496,7 +498,7 @@ describe('api', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/audiences-optouts.test.ts b/test/commands/audiences-optouts.test.ts index 78763a96..f37666c7 100644 --- a/test/commands/audiences-optouts.test.ts +++ b/test/commands/audiences-optouts.test.ts @@ -225,7 +225,7 @@ describe('Audience and opt-out commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/auth.test.ts b/test/commands/auth.test.ts index e06e9277..d4870662 100644 --- a/test/commands/auth.test.ts +++ b/test/commands/auth.test.ts @@ -55,7 +55,7 @@ describe('auth commands', () => { test('logs in from stdin, lists profiles, and switches active profile', async () => { await withConfig(async () => { const login = await withStdin( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0\n', async () => runCommand('auth login --with-api-key --profile work --json'), ) @@ -79,7 +79,7 @@ describe('auth commands', () => { test('reports keyring availability and logs out only the selected profile', async () => { await withConfig(async () => { await withStdin( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0\n', async () => runCommand('auth login --with-api-key --profile work --json'), ) @@ -105,7 +105,7 @@ describe('auth commands', () => { await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + 'pmfa_Q0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0OpuP5E', POLYMORFA_CLIENT_TOKEN: undefined, }, async () => { @@ -124,7 +124,7 @@ describe('auth commands', () => { test('stores a project-token profile with exact project ownership', async () => { await withConfig(async () => { - const token = `pmfa_pt_${'A'.repeat(94)}\n` + const token = `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg\n` const login = await withStdin(token, async () => runCommand( 'auth login --with-project-token --profile project --project project_1 --json', @@ -156,7 +156,7 @@ describe('auth commands', () => { }) test('reports an environment project token without exposing it', async () => { - const token = `pmfa_pt_${'A'.repeat(94)}` + const token = `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg` await withEnvironment( { POLYMORFA_API_KEY: undefined, diff --git a/test/commands/bansafe.test.ts b/test/commands/bansafe.test.ts index 5dcdd036..88adaa3c 100644 --- a/test/commands/bansafe.test.ts +++ b/test/commands/bansafe.test.ts @@ -491,7 +491,7 @@ describe('BanSafe commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/billing-controls.test.ts b/test/commands/billing-controls.test.ts index 1841264b..6da44f3f 100644 --- a/test/commands/billing-controls.test.ts +++ b/test/commands/billing-controls.test.ts @@ -9,7 +9,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' const key = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const project = '22222222-2222-4222-8222-222222222222', number = '33333333-3333-4333-8333-333333333333' const priorities = { diff --git a/test/commands/business.test.ts b/test/commands/business.test.ts index 9bf7cd06..cb45a0c9 100644 --- a/test/commands/business.test.ts +++ b/test/commands/business.test.ts @@ -545,7 +545,7 @@ describe('business commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -559,7 +559,7 @@ describe('business commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, run, ) diff --git a/test/commands/call-analytics.test.ts b/test/commands/call-analytics.test.ts index 7df50f74..8e85830f 100644 --- a/test/commands/call-analytics.test.ts +++ b/test/commands/call-analytics.test.ts @@ -15,9 +15,9 @@ import { import {temporaryDirectory} from '../support/fs.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const PROJECT_TOKEN = - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg' const PROJECT = '11111111-1111-4111-8111-111111111111' const HEADER = diff --git a/test/commands/call-consent.test.ts b/test/commands/call-consent.test.ts index d7120986..cbeac31e 100644 --- a/test/commands/call-consent.test.ts +++ b/test/commands/call-consent.test.ts @@ -12,8 +12,8 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' -const CLIENT_TOKEN = 'pmfa_ct_browser_token' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' +const CLIENT_TOKEN = 'pmfa_ct_YnJvd3Nlcl90b2tlbg' const OPT_OUT_ID = '0b9f6a52-8f0e-4a44-9d51-3c1f9d6f2a10' const NEXT_CURSOR = '1c9f6a52-8f0e-4a44-9d51-3c1f9d6f2a11' diff --git a/test/commands/call-links.test.ts b/test/commands/call-links.test.ts index 457d7771..b7c199a2 100644 --- a/test/commands/call-links.test.ts +++ b/test/commands/call-links.test.ts @@ -11,8 +11,8 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' -const CLIENT_TOKEN = 'pmfa_ct_browser_token' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' +const CLIENT_TOKEN = 'pmfa_ct_YnJvd3Nlcl90b2tlbg' const TOKEN = 'AbCdEf0123456789_link-token' describe('call link commands', () => { diff --git a/test/commands/call-records.test.ts b/test/commands/call-records.test.ts index fcc74723..973d27ed 100644 --- a/test/commands/call-records.test.ts +++ b/test/commands/call-records.test.ts @@ -8,7 +8,7 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const PROJECT = '11111111-1111-4111-8111-111111111111' const record = { callId: 'call_1', diff --git a/test/commands/calls-and-identities.test.ts b/test/commands/calls-and-identities.test.ts index ed0c8bee..71d7b503 100644 --- a/test/commands/calls-and-identities.test.ts +++ b/test/commands/calls-and-identities.test.ts @@ -164,7 +164,7 @@ describe('call and identity commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -178,7 +178,7 @@ describe('call and identity commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, run, ) diff --git a/test/commands/calls-sockets.test.ts b/test/commands/calls-sockets.test.ts index a4abe603..2c5c7dd6 100644 --- a/test/commands/calls-sockets.test.ts +++ b/test/commands/calls-sockets.test.ts @@ -15,6 +15,7 @@ import {Readable} from 'node:stream' import {fileURLToPath} from 'node:url' import {runCommand} from '@oclif/test' +import {Call} from '@polymorfa/sdk/calls' import {afterEach, beforeEach, describe, expect, test} from 'vitest' import {bridgeCallMedia, watchCalls} from '../../src/services/calls.js' @@ -26,8 +27,13 @@ import { import {withEnvironment} from '../helpers/http-server.js' const API_KEY = 'pmfa_socket_test_key_0123456789' -const CLIENT_TOKEN = 'pmfa_ct_socket_test_token' +const CLIENT_TOKEN = 'pmfa_ct_c29ja2V0X3Rlc3RfdG9rZW4' const TIMESTAMP = '2026-09-16T10:00:00.000Z' +const guestSdk = + typeof (Call.prototype as unknown as {admitParticipant?: unknown}) + .admitParticipant === 'function' +if (process.env.POLYMORFA_GUEST_SDK_REQUIRED === '1' && !guestSdk) + throw new Error('Guest acceptance requires the pinned candidate SDK package') describe('calls watch and media', () => { let server: CallsServer | undefined @@ -404,6 +410,112 @@ describe('calls watch and media', () => { }) }) + test.runIf(guestSdk)( + 'moderates a guest over the same live media connection and matches the result', + async () => { + const outputPath = join(directory, 'guest.pcm') + const controlsPath = join(directory, 'controls.jsonl') + await writeFile( + controlsPath, + '{"action":"admit","participantId":"123"}\n', + ) + const commands: Record[] = [] + server = await startCallsServer({ + onSocket: async (socket) => { + await socket.next() + if (socket.path.startsWith('/voip/ws')) { + socket.sendJson({participant: 'server:default', type: 'ready'}) + await delay(100) + sendEvent(socket, 'call.accepted', 'call_guest', { + answeredBy: 'server:default', + exclusive: false, + }) + return + } + socket.sendJson({ + callId: 'call_guest', + sampleRate: 16000, + type: 'ready', + video: false, + }) + socket.sendJson({ + type: 'waiting_room', + state: { + enabled: true, + isAdmin: true, + inWaitingRoom: false, + users: [ + { + id: '123', + state: 'invited', + audioMuted: false, + video: false, + guest: true, + name: 'Ada Guest', + }, + ], + }, + }) + const command = JSON.parse(String(await socket.next())) as Record< + string, + unknown + > + commands.push(command) + socket.sendJson({ + type: 'waiting_room_result', + requestId: 'unrelated_update', + ok: true, + }) + await delay(25) + socket.sendJson({ + type: 'waiting_room_result', + requestId: command.requestId, + ok: true, + }) + await delay(25) + socket.close(1000) + }, + rest: () => ({ + body: { + data: {callId: 'call_guest', session: 'support', video: false}, + success: true, + }, + status: 201, + }), + }) + const result = await apiKey(() => + runCommand( + `calls media --session support --place +15550100 --output ${outputPath} --control-input ${controlsPath} --json`, + ), + ) + expect(result.error, result.stderr).toBeUndefined() + expect(commands).toHaveLength(1) + expect(commands[0]).toMatchObject({ + type: 'waiting_room_control', + operation: 'admit', + participantId: '123', + }) + expect( + server.sockets.filter((s) => s.path.includes('/media')), + ).toHaveLength(1) + const statuses = result.stderr + .trim() + .split('\n') + .map((line) => JSON.parse(line) as Record) + expect(statuses).toContainEqual({ + type: 'waiting_room_control_result', + sequence: 1, + action: 'admit', + ok: true, + }) + expect( + statuses.find((value) => value.type === 'waiting_room'), + ).toMatchObject({ + room: {users: [{id: '123', guest: true, name: 'Ada Guest'}]}, + }) + }, + ) + test('finishes when a placed call ends before placement returns', async () => { let lifecycle: FakeSocket | undefined server = await startCallsServer({ diff --git a/test/commands/calls.test.ts b/test/commands/calls.test.ts index 0a942890..4ff30226 100644 --- a/test/commands/calls.test.ts +++ b/test/commands/calls.test.ts @@ -14,10 +14,10 @@ import { } from '../../src/services/calls.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' -const CLIENT_TOKEN = 'pmfa_ct_browser_token' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' +const CLIENT_TOKEN = 'pmfa_ct_YnJvd3Nlcl90b2tlbg' const PROJECT_TOKEN = - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg' const TRUNK_ID = '6f1c2f0e-1d5b-4d8e-9a55-0d4b8a6c1f10' const DEFAULT_RETENTION = { appliesTo: ['call_records', 'call_events', 'client_reports'], diff --git a/test/commands/campaign-conversions.test.ts b/test/commands/campaign-conversions.test.ts index 1628e216..99273d88 100644 --- a/test/commands/campaign-conversions.test.ts +++ b/test/commands/campaign-conversions.test.ts @@ -119,7 +119,7 @@ describe('Campaign conversion commands (beta)', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/campaign-follow-ups.test.ts b/test/commands/campaign-follow-ups.test.ts index 5fbb5c67..557f79c9 100644 --- a/test/commands/campaign-follow-ups.test.ts +++ b/test/commands/campaign-follow-ups.test.ts @@ -179,7 +179,7 @@ describe('campaign follow-up output (beta)', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/campaign-frequency-cap.test.ts b/test/commands/campaign-frequency-cap.test.ts index eef9d455..bde595a0 100644 --- a/test/commands/campaign-frequency-cap.test.ts +++ b/test/commands/campaign-frequency-cap.test.ts @@ -31,7 +31,7 @@ const settings = { function run(command: string) { return withEnvironment( { - POLYMORFA_API_KEY: `pmfa_${'A'.repeat(72)}`, + POLYMORFA_API_KEY: `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0`, POLYMORFA_BASE_URL: server!.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/campaign-recipients.test.ts b/test/commands/campaign-recipients.test.ts index f8bcfe7a..a66a5ead 100644 --- a/test/commands/campaign-recipients.test.ts +++ b/test/commands/campaign-recipients.test.ts @@ -415,7 +415,7 @@ describe('Campaign recipient commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/campaign-segments-drip.test.ts b/test/commands/campaign-segments-drip.test.ts index 7ea0a588..6d04c94e 100644 --- a/test/commands/campaign-segments-drip.test.ts +++ b/test/commands/campaign-segments-drip.test.ts @@ -86,7 +86,7 @@ async function run(command: string) { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/campaigns.test.ts b/test/commands/campaigns.test.ts index c42c87f8..97869559 100644 --- a/test/commands/campaigns.test.ts +++ b/test/commands/campaigns.test.ts @@ -318,7 +318,7 @@ describe('Messaging campaign commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -332,7 +332,7 @@ describe('Messaging campaign commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, run, ) diff --git a/test/commands/channels.test.ts b/test/commands/channels.test.ts index 3c1f5035..2b45f26d 100644 --- a/test/commands/channels.test.ts +++ b/test/commands/channels.test.ts @@ -345,7 +345,7 @@ describe('channel commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -359,7 +359,7 @@ describe('channel commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, run, ) diff --git a/test/commands/cloud-group.test.ts b/test/commands/cloud-group.test.ts index d20b8e44..3ac93c90 100644 --- a/test/commands/cloud-group.test.ts +++ b/test/commands/cloud-group.test.ts @@ -18,7 +18,9 @@ describe('Official group commands (beta)', () => { return withEnvironment( { POLYMORFA_API_KEY: - kind === 'api' ? `pmfa_${'A'.repeat(72)}` : undefined, + kind === 'api' + ? `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0` + : undefined, POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_CLIENT_TOKEN: kind === 'client' ? `pmfa_ct_${'A'.repeat(94)}` : undefined, diff --git a/test/commands/cloud.test.ts b/test/commands/cloud.test.ts index bf7477fd..dfafdbc3 100644 --- a/test/commands/cloud.test.ts +++ b/test/commands/cloud.test.ts @@ -113,7 +113,9 @@ describe('Official API commands', () => { ) const keyring = vi .spyOn(AsyncEntry.prototype, 'getPassword') - .mockResolvedValue(`pmfa_pt_${'A'.repeat(94)}`) + .mockResolvedValue( + `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg`, + ) server = await startHttpServer({ status: 202, body: {success: true, data: {accepted: true}}, @@ -466,9 +468,13 @@ describe('Official API commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - kind === 'api' ? `pmfa_${'A'.repeat(72)}` : undefined, + kind === 'api' + ? `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0` + : undefined, POLYMORFA_PROJECT_TOKEN: - kind === 'project' ? `pmfa_pt_${'A'.repeat(94)}` : undefined, + kind === 'project' + ? `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg` + : undefined, POLYMORFA_CLIENT_TOKEN: kind === 'client' ? `pmfa_ct_${'A'.repeat(94)}` : undefined, POLYMORFA_BASE_URL: server.baseUrl, diff --git a/test/commands/contacts.test.ts b/test/commands/contacts.test.ts index d92e5a1e..1013195a 100644 --- a/test/commands/contacts.test.ts +++ b/test/commands/contacts.test.ts @@ -219,7 +219,7 @@ describe('contact commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -233,7 +233,7 @@ describe('contact commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, run, ) diff --git a/test/commands/customers.test.ts b/test/commands/customers.test.ts index 682a6272..88561717 100644 --- a/test/commands/customers.test.ts +++ b/test/commands/customers.test.ts @@ -303,7 +303,7 @@ describe('Customer commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/developer-webhooks.test.ts b/test/commands/developer-webhooks.test.ts index b79c1e4c..cfad7152 100644 --- a/test/commands/developer-webhooks.test.ts +++ b/test/commands/developer-webhooks.test.ts @@ -882,7 +882,7 @@ function developerEnvironment(run: () => Promise): Promise { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: 'https://api.example.test', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/doctor.test.ts b/test/commands/doctor.test.ts index 5a005d20..fad9ec0e 100644 --- a/test/commands/doctor.test.ts +++ b/test/commands/doctor.test.ts @@ -19,7 +19,7 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' describe('doctor command exit status', () => { let server: TestHttpServer @@ -68,7 +68,7 @@ describe('doctor command exit status', () => { }) test('returns failure when credential validation is skipped', async () => { - const result = await doctor({POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_example'}) + const result = await doctor({POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_ZXhhbXBsZQ'}) expect(result.error, result.stderr).toBeUndefined() expect(JSON.parse(result.stdout)).toMatchObject({ok: false}) expect(process.exitCode).toBe(1) diff --git a/test/commands/event-stream.test.ts b/test/commands/event-stream.test.ts index 26f215fc..46f3430f 100644 --- a/test/commands/event-stream.test.ts +++ b/test/commands/event-stream.test.ts @@ -252,7 +252,7 @@ function environment(run: () => Promise): Promise { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: 'https://api.example.test', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/events.test.ts b/test/commands/events.test.ts index 7fcd2097..acb3e596 100644 --- a/test/commands/events.test.ts +++ b/test/commands/events.test.ts @@ -296,7 +296,7 @@ function environment(run: () => Promise): Promise { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: 'https://api.example.test', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/flow-endpoints.test.ts b/test/commands/flow-endpoints.test.ts index 3362c8f6..12c61814 100644 --- a/test/commands/flow-endpoints.test.ts +++ b/test/commands/flow-endpoints.test.ts @@ -18,7 +18,7 @@ describe('dynamic Flow endpoint commands', () => { return withEnvironment( { POLYMORFA_API_KEY: undefined, - POLYMORFA_PROJECT_TOKEN: `pmfa_pt_${'A'.repeat(94)}`, + POLYMORFA_PROJECT_TOKEN: `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg`, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server!.baseUrl, }, diff --git a/test/commands/flows.test.ts b/test/commands/flows.test.ts index 48bcaf3c..dba31e24 100644 --- a/test/commands/flows.test.ts +++ b/test/commands/flows.test.ts @@ -25,7 +25,9 @@ describe('project Flow commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_PROJECT_TOKEN: - kind === 'project' ? `pmfa_pt_${'A'.repeat(94)}` : undefined, + kind === 'project' + ? `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg` + : undefined, POLYMORFA_CLIENT_TOKEN: kind === 'client' ? `pmfa_ct_${'A'.repeat(94)}` : undefined, POLYMORFA_BASE_URL: server!.baseUrl, diff --git a/test/commands/functions.test.ts b/test/commands/functions.test.ts index 69bc63da..3f2bf651 100644 --- a/test/commands/functions.test.ts +++ b/test/commands/functions.test.ts @@ -10,7 +10,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' const KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const PROJECT = '018f0000-0000-7000-8000-000000000001', FN = '018f0000-0000-7000-8000-000000000002', DEPLOY = '018f0000-0000-7000-8000-000000000003', @@ -395,7 +395,8 @@ describe('Function commands', () => { server = await startHttpServer({ body: {data: {items: [], nextCursor: null}}, }) - const token = 'pmfa_pt_' + 'A'.repeat(94) + const token = + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg' const result = await withEnvironment( { POLYMORFA_API_KEY: undefined, diff --git a/test/commands/group-mutations.test.ts b/test/commands/group-mutations.test.ts index 840e247b..90a0b314 100644 --- a/test/commands/group-mutations.test.ts +++ b/test/commands/group-mutations.test.ts @@ -9,7 +9,7 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' describe('group mutation commands', () => { let server: TestHttpServer | undefined diff --git a/test/commands/groups.test.ts b/test/commands/groups.test.ts index ee3946ff..4ad1929f 100644 --- a/test/commands/groups.test.ts +++ b/test/commands/groups.test.ts @@ -96,7 +96,7 @@ describe('group commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, () => runCommand('group list --session session_1 --json'), ) @@ -177,7 +177,7 @@ describe('group commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/history.test.ts b/test/commands/history.test.ts index ac4ee258..67a7ae74 100644 --- a/test/commands/history.test.ts +++ b/test/commands/history.test.ts @@ -86,7 +86,7 @@ describe('stored chat history commands', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: undefined, - POLYMORFA_PROJECT_TOKEN: `pmfa_pt_${'A'.repeat(94)}`, + POLYMORFA_PROJECT_TOKEN: `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg`, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, }, @@ -140,7 +140,7 @@ describe('stored chat history commands', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: undefined, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', POLYMORFA_BASE_URL: server.baseUrl, }, () => runCommand('chat list --session number_1 --json'), @@ -210,7 +210,7 @@ describe('stored chat history commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, }, diff --git a/test/commands/hybrid-credentials.test.ts b/test/commands/hybrid-credentials.test.ts index 1fa6818f..42169128 100644 --- a/test/commands/hybrid-credentials.test.ts +++ b/test/commands/hybrid-credentials.test.ts @@ -10,8 +10,8 @@ import { } from '../helpers/http-server.js' const project = '11111111-1111-4111-8111-111111111111' -const apiKey = `pmfa_${'A'.repeat(72)}` -const projectToken = `pmfa_pt_${'A'.repeat(94)}` +const apiKey = `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0` +const projectToken = `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg` const cases = [ { command: 'hybrid-link state --session existing', @@ -301,7 +301,7 @@ test.each(cases)( POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_API_KEY: undefined, POLYMORFA_PROJECT_TOKEN: undefined, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, async () => { const result = await runCommand(`${command} --json`) @@ -309,7 +309,7 @@ test.each(cases)( expect(JSON.parse(result.stderr)).toMatchObject({ error: {category: 'configuration'}, }) - expect(result.stderr).not.toContain('pmfa_ct_browser') + expect(result.stderr).not.toContain('pmfa_ct_YnJvd3Nlcg') }, ) expect(server.requests).toEqual([]) @@ -362,7 +362,9 @@ test('invalid project-token format is rejected before transport', async () => { 'hybrid-link state --session existing --json', ) expect(result.error).toBeDefined() - expect(result.stderr).toContain('canonical pmfa_pt_ v1 format') + expect(result.stderr).toMatch( + /canonical (?:pmfa_pt_|\[REDACTED\]) (?:v1|opaque) format/, + ) expect(result.stderr).not.toContain('pmfa_pt_invalid') }, ) diff --git a/test/commands/hybrid-link.test.ts b/test/commands/hybrid-link.test.ts index 37fc4a14..9afd24f5 100644 --- a/test/commands/hybrid-link.test.ts +++ b/test/commands/hybrid-link.test.ts @@ -9,7 +9,7 @@ import { } from '../helpers/http-server.js' const project = '11111111-1111-4111-8111-111111111111' const env = (url: string) => ({ - POLYMORFA_API_KEY: `pmfa_${'A'.repeat(72)}`, + POLYMORFA_API_KEY: `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0`, POLYMORFA_BASE_URL: url, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/labels.test.ts b/test/commands/labels.test.ts index 6b8ebf43..e8317641 100644 --- a/test/commands/labels.test.ts +++ b/test/commands/labels.test.ts @@ -63,7 +63,7 @@ describe('label commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, () => runCommand('label list --session session_1 --json'), ) @@ -221,7 +221,7 @@ describe('label commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/listen.test.ts b/test/commands/listen.test.ts index cc3e9284..80eae58d 100644 --- a/test/commands/listen.test.ts +++ b/test/commands/listen.test.ts @@ -43,7 +43,7 @@ describe('listen', () => { POLYMORFA_BASE_URL: baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }, () => runCommand(`listen --project ${PROJECT} --event message.* --json`), ) @@ -123,7 +123,7 @@ describe('listen', () => { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }, () => runCommand( @@ -159,7 +159,7 @@ describe('listen', () => { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }, () => runCommand( @@ -177,7 +177,7 @@ describe('listen', () => { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }, () => runCommand( @@ -194,7 +194,7 @@ describe('listen', () => { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }, () => runCommand( diff --git a/test/commands/media.test.ts b/test/commands/media.test.ts index 43b3b2b0..3a9988de 100644 --- a/test/commands/media.test.ts +++ b/test/commands/media.test.ts @@ -52,7 +52,7 @@ describe('media commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, () => runCommand('media view media_1 --json'), ) @@ -450,7 +450,7 @@ describe('media commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/message-sends.test.ts b/test/commands/message-sends.test.ts index e474ea9b..182dd140 100644 --- a/test/commands/message-sends.test.ts +++ b/test/commands/message-sends.test.ts @@ -12,7 +12,7 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' describe('typed message send commands', () => { let server: TestHttpServer | undefined diff --git a/test/commands/messages.test.ts b/test/commands/messages.test.ts index ff13d345..a949b3b6 100644 --- a/test/commands/messages.test.ts +++ b/test/commands/messages.test.ts @@ -134,7 +134,7 @@ describe('message commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, () => runCommand( @@ -257,7 +257,7 @@ describe('message commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/number-tiers.test.ts b/test/commands/number-tiers.test.ts index d16b61a8..74a45b67 100644 --- a/test/commands/number-tiers.test.ts +++ b/test/commands/number-tiers.test.ts @@ -452,7 +452,7 @@ describe('session tier commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/operations.test.ts b/test/commands/operations.test.ts index bccea36e..4789d598 100644 --- a/test/commands/operations.test.ts +++ b/test/commands/operations.test.ts @@ -330,7 +330,7 @@ function environment(run: () => Promise): Promise { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: api.url, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/platform-management.test.ts b/test/commands/platform-management.test.ts index 2eafd47a..efa317e2 100644 --- a/test/commands/platform-management.test.ts +++ b/test/commands/platform-management.test.ts @@ -137,7 +137,7 @@ describe('Platform management commands', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: undefined, - POLYMORFA_PROJECT_TOKEN: `pmfa_pt_${'A'.repeat(94)}`, + POLYMORFA_PROJECT_TOKEN: `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg`, POLYMORFA_BASE_URL: server.baseUrl, }, () => runCommand('session list --json'), @@ -739,7 +739,7 @@ describe('Platform management commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/presence.test.ts b/test/commands/presence.test.ts index d005f98d..977116e2 100644 --- a/test/commands/presence.test.ts +++ b/test/commands/presence.test.ts @@ -184,7 +184,7 @@ describe('presence commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -198,7 +198,7 @@ describe('presence commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, run, ) diff --git a/test/commands/privacy.test.ts b/test/commands/privacy.test.ts index 12f44985..4d95c6da 100644 --- a/test/commands/privacy.test.ts +++ b/test/commands/privacy.test.ts @@ -57,7 +57,7 @@ describe('privacy commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, () => runCommand('privacy view --session session_1 --json'), ) @@ -165,7 +165,7 @@ describe('privacy commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/profile.test.ts b/test/commands/profile.test.ts index 1db44ec7..dc70816b 100644 --- a/test/commands/profile.test.ts +++ b/test/commands/profile.test.ts @@ -83,7 +83,7 @@ describe('profile commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, () => runCommand('profile view --session session_1 --json'), ) @@ -274,7 +274,7 @@ describe('profile commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/project-context.test.ts b/test/commands/project-context.test.ts index 9092e7a4..212eb1bf 100644 --- a/test/commands/project-context.test.ts +++ b/test/commands/project-context.test.ts @@ -12,7 +12,7 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const APP = '11111111-1111-4111-8111-111111111111' describe('link and project commands', () => { diff --git a/test/commands/quick-replies.test.ts b/test/commands/quick-replies.test.ts index 13e0ca80..5185b8c6 100644 --- a/test/commands/quick-replies.test.ts +++ b/test/commands/quick-replies.test.ts @@ -54,7 +54,7 @@ describe('quick-reply commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, () => runCommand('quick-reply list --session session_1 --json'), ) @@ -187,7 +187,7 @@ describe('quick-reply commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/quicklinks.test.ts b/test/commands/quicklinks.test.ts index c05894a5..1c00e3d9 100644 --- a/test/commands/quicklinks.test.ts +++ b/test/commands/quicklinks.test.ts @@ -35,7 +35,7 @@ test('creates a QuickLink and uploads separate test history with exact project s try { await withEnvironment( { - POLYMORFA_API_KEY: `pmfa_${'A'.repeat(72)}`, + POLYMORFA_API_KEY: `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0`, POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, @@ -69,8 +69,8 @@ test('creates a QuickLink and uploads separate test history with exact project s }) const projectId = '11111111-1111-4111-8111-111111111111' -const apiKey = `pmfa_${'A'.repeat(72)}` -const projectToken = `pmfa_pt_${'A'.repeat(94)}` +const apiKey = `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0` +const projectToken = `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg` test('retrieves QuickLink status with an exact-project token and encoded ID', async () => { const server = await startHttpSequenceServer([ diff --git a/test/commands/request-logs.test.ts b/test/commands/request-logs.test.ts index 1043d7d7..0dfedb6d 100644 --- a/test/commands/request-logs.test.ts +++ b/test/commands/request-logs.test.ts @@ -8,7 +8,7 @@ import { } from '../helpers/http-server.js' const key = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const project = '22222222-2222-4222-8222-222222222222' let server: TestHttpServer diff --git a/test/commands/sip-trunks.test.ts b/test/commands/sip-trunks.test.ts index 95c75fb1..a75cbd5a 100644 --- a/test/commands/sip-trunks.test.ts +++ b/test/commands/sip-trunks.test.ts @@ -16,7 +16,7 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const PROJECT = '018f0000-0000-7000-8000-000000000002' const TRUNK_ID = '6f1c2f0e-1d5b-4d8e-9a55-0d4b8a6c1f10' diff --git a/test/commands/trigger.test.ts b/test/commands/trigger.test.ts index 67909f7e..4c62c480 100644 --- a/test/commands/trigger.test.ts +++ b/test/commands/trigger.test.ts @@ -7,7 +7,7 @@ import { } from '../helpers/http-server.js' const projectId = '11111111-1111-4111-8111-111111111111' -const apiKey = `pmfa_${'A'.repeat(72)}` +const apiKey = `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0` const eventId = '0199f1c2-7a4e-7c55-9d1e-3f0b8a2c6d10' async function run( diff --git a/test/commands/usage.test.ts b/test/commands/usage.test.ts index 1aa474c1..0aec951b 100644 --- a/test/commands/usage.test.ts +++ b/test/commands/usage.test.ts @@ -8,9 +8,9 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const PROJECT_TOKEN = - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg' const PROJECT_A = '22222222-2222-4222-8222-222222222222' const PROJECT_B = '33333333-3333-4333-8333-333333333333' diff --git a/test/commands/voice-wait-timeout.test.ts b/test/commands/voice-wait-timeout.test.ts index 032d06d5..2e289627 100644 --- a/test/commands/voice-wait-timeout.test.ts +++ b/test/commands/voice-wait-timeout.test.ts @@ -8,7 +8,7 @@ import {expect, test} from 'vitest' import {temporaryDirectory} from '../support/fs.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const ASSET_ID = '6f1c2f0e-1d5b-4d8e-9a55-0d4b8a6c1f10' const PROJECT = '018f0000-0000-7000-8000-000000000002' diff --git a/test/commands/voice.test.ts b/test/commands/voice.test.ts index 7f3109da..21b6335b 100644 --- a/test/commands/voice.test.ts +++ b/test/commands/voice.test.ts @@ -12,7 +12,7 @@ import { } from '../helpers/http-server.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const PROVIDER_KEY = 'sk-provider-secret-0123456789' const PROJECT = '018f0000-0000-7000-8000-000000000002' const ASSET_ID = '6f1c2f0e-1d5b-4d8e-9a55-0d4b8a6c1f10' diff --git a/test/context/environment.test.ts b/test/context/environment.test.ts index 0d6a8518..8ea96c4d 100644 --- a/test/context/environment.test.ts +++ b/test/context/environment.test.ts @@ -17,7 +17,7 @@ describe('resolveEnvironment', () => { env: { POLYMORFA_BASE_URL: 'http://127.0.0.1:4567', POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }, apiVersion: '2026-09-01', project: PROJECT, @@ -27,7 +27,7 @@ describe('resolveEnvironment', () => { apiVersion: '2026-09-01', baseUrl: 'http://127.0.0.1:4567', credential: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', principalType: 'project_token', projectId: PROJECT, timeoutMs: 4321, @@ -39,7 +39,7 @@ describe('resolveEnvironment', () => { resolveListenerEnvironment({ env: { POLYMORFA_API_KEY: - 'pmfa_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD', + 'pmfa_REREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQYKPIt', POLYMORFA_PROJECT_TOKEN: 'pmfa_pt', }, project: 'project_1', @@ -68,7 +68,7 @@ describe('resolveEnvironment', () => { {env: {}, profile: 'project'}, {load: () => Promise.resolve(profile), save: () => Promise.resolve()}, fakeCredentials( - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', ), ), ).resolves.toMatchObject({ @@ -79,7 +79,7 @@ describe('resolveEnvironment', () => { projectId: PROJECT, }, credential: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }) }) @@ -96,13 +96,13 @@ describe('resolveEnvironment', () => { }, fakeProfiles(), fakeCredentials( - 'pmfa_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + 'pmfa_QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLRQ_38', ), ), ).resolves.toMatchObject({ context: {owner: 'organization', profile: 'work'}, credential: - 'pmfa_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + 'pmfa_QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLRQ_38', }) }) @@ -131,12 +131,12 @@ describe('resolveEnvironment', () => { }, {load: () => Promise.resolve(profile), save: () => Promise.resolve()}, fakeCredentials( - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', ), ), ).resolves.toMatchObject({ credential: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', profile: 'project', projectId: '11111111-1111-4111-8111-111111111111', }) @@ -144,7 +144,7 @@ describe('resolveEnvironment', () => { test('prefers an environment API key over the active listener profile', async () => { const credentials = fakeCredentials( - 'pmfa_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + 'pmfa_QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLRQ_38', ) await expect( @@ -152,7 +152,7 @@ describe('resolveEnvironment', () => { { env: { POLYMORFA_API_KEY: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + 'pmfa_Q0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0OpuP5E', }, project: '11111111-1111-4111-8111-111111111111', }, @@ -161,7 +161,7 @@ describe('resolveEnvironment', () => { ), ).resolves.toMatchObject({ credential: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + 'pmfa_Q0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0OpuP5E', principalType: 'organization_key', }) expect(credentials.get).not.toHaveBeenCalled() @@ -175,7 +175,7 @@ describe('resolveEnvironment', () => { { env: { POLYMORFA_API_KEY: - 'pmfa_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD', + 'pmfa_REREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQYKPIt', }, project: 'checkout', }, @@ -196,7 +196,7 @@ describe('resolveEnvironment', () => { { env: { POLYMORFA_API_KEY: - 'pmfa_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD', + 'pmfa_REREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQYKPIt', }, owner: 'project', project: 'checkout', @@ -227,7 +227,7 @@ describe('resolveEnvironment', () => { { env: { POLYMORFA_API_KEY: - 'pmfa_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD', + 'pmfa_REREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQYKPIt', }, project: 'checkout', }, @@ -258,7 +258,7 @@ describe('resolveEnvironment', () => { resolveDeveloperEnvironment({ env: { POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }, project: PROJECT, }), @@ -270,7 +270,7 @@ describe('resolveEnvironment', () => { resolveEnvironment({ env: { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_BASE_URL: 'http://127.0.0.1:4567', UNRELATED_SECRET: 'do-not-copy', }, @@ -282,7 +282,7 @@ describe('resolveEnvironment', () => { credential: { type: 'apiKey', value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', }, baseUrl: 'http://127.0.0.1:4567', timeoutMs: 5000, @@ -292,7 +292,7 @@ describe('resolveEnvironment', () => { test('rejects a client token for the Platform surface', () => { expect(() => resolveEnvironment({ - env: {POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser'}, + env: {POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg'}, surface: 'platform', }), ).toThrow('Platform API requests require POLYMORFA_API_KEY.') @@ -301,12 +301,12 @@ describe('resolveEnvironment', () => { test('resolves a client token for the Messaging surface', () => { expect( resolveEnvironment({ - env: {POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser'}, + env: {POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg'}, surface: 'messaging', }), ).toEqual({ surface: 'messaging', - credential: {type: 'clientToken', value: 'pmfa_ct_browser'}, + credential: {type: 'clientToken', value: 'pmfa_ct_YnJvd3Nlcg'}, }) }) @@ -315,7 +315,7 @@ describe('resolveEnvironment', () => { resolveEnvironment({ env: { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', }, surface: 'messaging', }), @@ -324,7 +324,7 @@ describe('resolveEnvironment', () => { credential: { type: 'apiKey', value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', }, }) }) @@ -334,8 +334,8 @@ describe('resolveEnvironment', () => { resolveEnvironment({ env: { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', + POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_YnJvd3Nlcg', }, surface: 'messaging', }), @@ -467,7 +467,7 @@ describe('resolveEnvironment', () => { test('prefers an environment credential over the active profile', async () => { const credentials = fakeCredentials( - 'pmfa_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + 'pmfa_QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLRQ_38', ) await expect( @@ -475,7 +475,7 @@ describe('resolveEnvironment', () => { { env: { POLYMORFA_API_KEY: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + 'pmfa_Q0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0OpuP5E', }, surface: 'platform', }, @@ -486,7 +486,7 @@ describe('resolveEnvironment', () => { credential: { type: 'apiKey', value: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + 'pmfa_Q0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0OpuP5E', }, source: 'environment', }) @@ -499,14 +499,14 @@ describe('resolveEnvironment', () => { {env: {}, surface: 'platform'}, fakeProfiles(), fakeCredentials( - 'pmfa_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + 'pmfa_QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLRQ_38', ), ), ).resolves.toMatchObject({ credential: { type: 'apiKey', value: - 'pmfa_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + 'pmfa_QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLRQ_38', }, profile: 'work', source: 'profile', @@ -519,21 +519,21 @@ describe('resolveEnvironment', () => { { env: { POLYMORFA_API_KEY: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + 'pmfa_Q0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0OpuP5E', }, profile: 'work', surface: 'messaging', }, fakeProfiles(), fakeCredentials( - 'pmfa_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + 'pmfa_QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLRQ_38', ), ), ).resolves.toMatchObject({ credential: { type: 'apiKey', value: - 'pmfa_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + 'pmfa_QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLRQ_38', }, profile: 'work', source: 'profile', @@ -543,7 +543,7 @@ describe('resolveEnvironment', () => { describe('resolveDeveloperEnvironment owner inference', () => { const key = - 'pmfa_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB' + 'pmfa_QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLRQ_38' test('reads the whole organization despite a saved project profile', async () => { const config: ProfileConfig = { @@ -611,7 +611,7 @@ describe('resolveDeveloperEnvironment owner inference', () => { { env: { POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }, inferOwner: true, }, @@ -678,7 +678,7 @@ function fakeCredentials(value: string): CredentialStore { } } -const PROJECT_TOKEN = `pmfa_pt_${'A'.repeat(94)}` +const PROJECT_TOKEN = `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg` function projectProfiles() { const config: ProfileConfig = { version: 2, diff --git a/test/developer/client.test.ts b/test/developer/client.test.ts index 6abdfa6c..e588b81d 100644 --- a/test/developer/client.test.ts +++ b/test/developer/client.test.ts @@ -12,7 +12,7 @@ describe('createDeveloperSession', () => { const session = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, }, @@ -32,7 +32,7 @@ describe('createDeveloperSession', () => { const session = await withEnvironment( { POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, }, @@ -59,7 +59,7 @@ describe('createDeveloperSession', () => { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }, () => createDeveloperSession({ diff --git a/test/input/stdin.test.ts b/test/input/stdin.test.ts index abaa3e46..b43a348e 100644 --- a/test/input/stdin.test.ts +++ b/test/input/stdin.test.ts @@ -8,11 +8,11 @@ describe('readSecretFromStdin', () => { await expect( readSecretFromStdin( Readable.from([ - ' pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n', + ' pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0\n', ]), ), ).resolves.toBe( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', ) }) diff --git a/test/mcp/session-discovery.test.ts b/test/mcp/session-discovery.test.ts index 0c7dcc87..f2a9447a 100644 --- a/test/mcp/session-discovery.test.ts +++ b/test/mcp/session-discovery.test.ts @@ -8,7 +8,7 @@ import { } from '../helpers/http-server.js' const PROJECT_ID = '11111111-1111-4111-8111-111111111111' -const API_KEY = `pmfa_${'A'.repeat(72)}` +const API_KEY = `pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0` describe('MCP session discovery', () => { let server: TestHttpServer | undefined diff --git a/test/sdk/client.test.ts b/test/sdk/client.test.ts index ef7a8423..c4f33b25 100644 --- a/test/sdk/client.test.ts +++ b/test/sdk/client.test.ts @@ -21,7 +21,7 @@ describe('createRawClient', () => { credential: { type: 'apiKey', value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', }, }) @@ -31,7 +31,7 @@ describe('createRawClient', () => { test('returns the public Messaging raw client', () => { const client = createRawClient({ surface: 'messaging', - credential: {type: 'clientToken', value: 'pmfa_ct_browser'}, + credential: {type: 'clientToken', value: 'pmfa_ct_YnJvd3Nlcg'}, }) expect(client).toBeInstanceOf(RawClient) @@ -41,10 +41,10 @@ describe('createRawClient', () => { expect(() => createRawClient({ surface: 'platform', - credential: {type: 'clientToken', value: 'pmfa_ct_browser'}, + credential: {type: 'clientToken', value: 'pmfa_ct_YnJvd3Nlcg'}, }), ).toThrow( - 'Client and project tokens cannot be used as organization server API keys.', + /Client and project tokens cannot be used as (?:organization server API|team) keys\./, ) }) @@ -54,7 +54,7 @@ describe('createRawClient', () => { credential: { type: 'apiKey', value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', }, timeoutMs: 1234, }) @@ -73,7 +73,7 @@ describe('createRawClient', () => { credential: { type: 'projectToken', value: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', }, surface: 'messaging', }) @@ -88,7 +88,7 @@ describe('createRawClient', () => { credential: { type: 'apiKey', value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', }, }) @@ -111,7 +111,7 @@ describe('createRawClient', () => { credential: { type: 'apiKey', value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', }, }), ).toThrow('requires the Platform API surface') @@ -128,7 +128,7 @@ describe('createRawClient', () => { credential: { type: 'apiKey', value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', }, surface: 'platform', }).project('11111111-1111-4111-8111-111111111111') @@ -143,7 +143,7 @@ describe('createRawClient', () => { url: '/platform/projects/11111111-1111-4111-8111-111111111111/events?limit=25', }) expect(server.requests[0]?.headers.authorization).toBe( - 'Bearer pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'Bearer pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', ) } finally { await server.close() diff --git a/test/services/auth.test.ts b/test/services/auth.test.ts index d0501c27..01750316 100644 --- a/test/services/auth.test.ts +++ b/test/services/auth.test.ts @@ -10,7 +10,7 @@ describe('AuthService', () => { const result = await fixture.service.login({ apiKey: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', profile: 'work', }) @@ -21,7 +21,7 @@ describe('AuthService', () => { }) expect(fixture.credentials.set).toHaveBeenCalledWith( 'profile:work:apiKey', - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', ) expect(fixture.saved()).toEqual({ activeProfile: 'work', @@ -33,7 +33,7 @@ describe('AuthService', () => { version: 2, }) expect(JSON.stringify(fixture.saved())).not.toContain( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', ) }) @@ -43,7 +43,7 @@ describe('AuthService', () => { await expect( fixture.service.login({ apiKey: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', profile: '../work', }), ).rejects.toThrow('Profile names may contain') @@ -55,13 +55,13 @@ describe('AuthService', () => { await expect( fixture.service.login({apiKey: 'secret', profile: 'work'}), - ).rejects.toThrow('must use the canonical pmfa_ v1 format') + ).rejects.toThrow(/must use the canonical pmfa_ (?:v1|opaque) format/) expect(fixture.credentials.set).not.toHaveBeenCalled() }) test('stores an exact-project token only with explicit project ownership', async () => { const fixture = createFixture() - const token = `pmfa_pt_${'A'.repeat(94)}` + const token = `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg` await expect( fixture.service.loginProjectToken({ @@ -89,12 +89,12 @@ describe('AuthService', () => { profile: 'project', project: 'project_1', projectToken: - ' pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ', + ' pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg ', }) expect(fixture.credentials.set).toHaveBeenCalledWith( 'profile:project:projectToken', - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg', ) await expect( fixture.service.loginProjectToken({ @@ -102,7 +102,9 @@ describe('AuthService', () => { project: 'project_1', projectToken: 'pmfa_pt_', }), - ).rejects.toThrow('canonical pmfa_pt_ v1 format') + ).rejects.toThrow( + /canonical (?:pmfa_pt_|\[REDACTED\]) (?:v1|opaque) format/, + ) }) test('removes the previous project-token keyring entry after switching a profile to an API key', async () => { @@ -120,12 +122,12 @@ describe('AuthService', () => { version: 2, }) vi.mocked(fixture.credentials.get).mockResolvedValue( - `pmfa_pt_${'A'.repeat(94)}`, + `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg`, ) await fixture.service.login({ apiKey: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', profile: 'work', }) @@ -157,7 +159,7 @@ describe('AuthService', () => { }, version: 2, }) - const oldToken = `pmfa_pt_${'A'.repeat(94)}` + const oldToken = `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg` vi.mocked(fixture.credentials.get).mockResolvedValue(oldToken) vi.mocked(fixture.repository.save).mockRejectedValue( new Error('profile save failed'), @@ -166,7 +168,7 @@ describe('AuthService', () => { await expect( fixture.service.login({ apiKey: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', profile: 'work', }), ).rejects.toThrow('profile save failed') @@ -216,7 +218,7 @@ describe('AuthService', () => { test('switches the active profile and reports secure credential availability', async () => { const fixture = createFixture(profileConfig()) vi.mocked(fixture.credentials.get).mockResolvedValue( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', ) await expect(fixture.service.use('work')).resolves.toMatchObject({ @@ -250,7 +252,7 @@ describe('AuthService', () => { version: 2, }) vi.mocked(fixture.credentials.get).mockResolvedValue( - `pmfa_pt_${'A'.repeat(94)}`, + `pmfa_pt_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBeS8leg`, ) await expect(fixture.service.status('project')).resolves.toMatchObject({ diff --git a/test/services/call-guest-controls.test.ts b/test/services/call-guest-controls.test.ts new file mode 100644 index 00000000..870af8ca --- /dev/null +++ b/test/services/call-guest-controls.test.ts @@ -0,0 +1,58 @@ +import {Readable} from 'node:stream' +import {describe, expect, test, vi} from 'vitest' +import { + assertWaitingRoomSupported, + moderateWaitingRoom, + waitingRoomCommands, +} from '../../src/services/call-media-controls.js' + +describe('live guest moderation', () => { + test('refuses old SDKs before a connection', () => { + expect(() => assertWaitingRoomSupported({})).toThrow('published Calls SDK') + }) + test('uses the held connection and never retries an unknown outcome', async () => { + const admitParticipant = vi.fn(() => + Promise.reject(new Error('waiting_room_control_unknown')), + ) + const call = { + setApprovalRequired: vi.fn(), + admitParticipant, + denyParticipant: vi.fn(), + } + await expect( + moderateWaitingRoom(call, {action: 'admit', participantId: '123'}), + ).rejects.toThrow('unknown') + expect(admitParticipant).toHaveBeenCalledExactlyOnceWith('123') + expect(call.denyParticipant).not.toHaveBeenCalled() + }) + test('reads strict commands separately from PCM', async () => { + const commands = [] + for await (const command of waitingRoomCommands( + Readable.from([ + Buffer.from( + '{"action":"admit","participantId":"123"}\n{"action":"set_approval_required","enabled":true}\n', + ), + ]), + )) + commands.push(command) + expect(commands).toEqual([ + {action: 'admit', participantId: '123'}, + {action: 'set_approval_required', enabled: true}, + ]) + }) + test.each([ + '{"action":"admit","participantId":"123@lid"}', + '{"action":"deny","participantId":"123","connectionId":"foreign"}', + 'x'.repeat(4097), + ])('rejects invalid or unbounded commands', async (line) => { + await expect( + (async () => { + for await (const _ of waitingRoomCommands( + Readable.from([Buffer.from(line)]), + )) { + void _ + } + })(), + ).rejects.toThrow() + }) +}) diff --git a/test/services/doctor.test.ts b/test/services/doctor.test.ts index 67337e1d..48d6b537 100644 --- a/test/services/doctor.test.ts +++ b/test/services/doctor.test.ts @@ -10,7 +10,7 @@ import type {ProfileConfig} from '../../src/config/profiles.js' import {runDoctor, type DoctorDependencies} from '../../src/services/doctor.js' const KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const config: ProfileConfig = { activeProfile: 'work', profiles: { @@ -254,7 +254,7 @@ describe('doctor', () => { test('does not remotely validate client tokens', async () => { const report = await runDoctor( - deps({env: {POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_x'}}), + deps({env: {POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_eA'}}), ) expect(status(report).credential).toBe('skip') expect(report.ok).toBe(false) diff --git a/test/services/groups.test.ts b/test/services/groups.test.ts index 6306df2c..3965bdb7 100644 --- a/test/services/groups.test.ts +++ b/test/services/groups.test.ts @@ -107,7 +107,7 @@ function client(baseUrl: string) { credential: { type: 'apiKey', value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', }, surface: 'messaging', }) diff --git a/test/services/projects.test.ts b/test/services/projects.test.ts index b27158da..74a7c683 100644 --- a/test/services/projects.test.ts +++ b/test/services/projects.test.ts @@ -18,7 +18,7 @@ import { import {ProjectContextService} from '../../src/services/projects.js' const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0' const APP = '11111111-1111-4111-8111-111111111111' const WEB = '22222222-2222-4222-8222-222222222222' diff --git a/test/services/voice.test.ts b/test/services/voice.test.ts index c4d8744a..7a1cf5c6 100644 --- a/test/services/voice.test.ts +++ b/test/services/voice.test.ts @@ -146,7 +146,7 @@ describe('voice transfers', () => { credential: { type: 'apiKey' as const, value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFYTvk0', }, surface: 'platform' as const, ...(timeoutMs === undefined ? {} : {timeoutMs}), diff --git a/vitest.config.ts b/vitest.config.ts index ed3126a6..17c20d5a 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,8 +1,11 @@ +import {availableParallelism} from 'node:os' import {defineConfig} from 'vitest/config' export default defineConfig({ test: { clearMocks: true, + // Bound cold CLI/SDK imports without relaxing command deadlines. + maxWorkers: Math.min(4, availableParallelism()), disableConsoleIntercept: true, include: ['test/**/*.test.ts'], },