(
workspaceId: string,
settings: WorkspaceHeartbeatSettingsUpdate
)
| 4411 | } |
| 4412 | |
| 4413 | async setHeartbeatSettings( |
| 4414 | workspaceId: string, |
| 4415 | settings: WorkspaceHeartbeatSettingsUpdate |
| 4416 | ): Promise<Result<WorkspaceHeartbeatSettings, string>> { |
| 4417 | try { |
| 4418 | assert( |
| 4419 | settings != null && typeof settings === "object", |
| 4420 | "setHeartbeatSettings requires settings" |
| 4421 | ); |
| 4422 | |
| 4423 | const hasEnabledUpdate = Object.prototype.hasOwnProperty.call(settings, "enabled"); |
| 4424 | assert( |
| 4425 | !hasEnabledUpdate || typeof settings.enabled === "boolean", |
| 4426 | "Heartbeat enabled flag must be a boolean when provided" |
| 4427 | ); |
| 4428 | const hasIntervalUpdate = Object.prototype.hasOwnProperty.call(settings, "intervalMs"); |
| 4429 | assert( |
| 4430 | !hasIntervalUpdate || Number.isInteger(settings.intervalMs), |
| 4431 | "Heartbeat interval must be an integer when provided" |
| 4432 | ); |
| 4433 | assert( |
| 4434 | !hasIntervalUpdate || |
| 4435 | (settings.intervalMs! >= HEARTBEAT_MIN_INTERVAL_MS && |
| 4436 | settings.intervalMs! <= HEARTBEAT_MAX_INTERVAL_MS), |
| 4437 | `Heartbeat interval must be between ${HEARTBEAT_MIN_INTERVAL_MS} and ${HEARTBEAT_MAX_INTERVAL_MS} ms` |
| 4438 | ); |
| 4439 | const hasMessageUpdate = Object.prototype.hasOwnProperty.call(settings, "message"); |
| 4440 | assert( |
| 4441 | !hasMessageUpdate || settings.message == null || typeof settings.message === "string", |
| 4442 | "Heartbeat message must be a string when provided" |
| 4443 | ); |
| 4444 | const hasContextModeUpdate = Object.prototype.hasOwnProperty.call(settings, "contextMode"); |
| 4445 | assert( |
| 4446 | !hasContextModeUpdate || |
| 4447 | settings.contextMode == null || |
| 4448 | isHeartbeatContextMode(settings.contextMode), |
| 4449 | "Heartbeat context mode must be a supported value when provided" |
| 4450 | ); |
| 4451 | |
| 4452 | const resolved = this.resolveHeartbeatWorkspaceEntry(workspaceId, "setHeartbeatSettings"); |
| 4453 | if (!resolved.success) { |
| 4454 | return Err(resolved.error); |
| 4455 | } |
| 4456 | |
| 4457 | const { normalizedWorkspaceId, config, workspaceEntry } = resolved.data; |
| 4458 | const defaultIntervalMs = this.getHeartbeatDefaultIntervalMsFromConfig(config); |
| 4459 | const currentSettings = normalizeHeartbeatSettings( |
| 4460 | workspaceEntry.heartbeat, |
| 4461 | defaultIntervalMs |
| 4462 | ); |
| 4463 | const nextMessage = hasMessageUpdate |
| 4464 | ? sanitizeHeartbeatMessage(settings.message) |
| 4465 | : currentSettings?.message; |
| 4466 | // Keep the interval on disk even when disabled so re-enabling restores the user's choice. |
| 4467 | const nextSettings: WorkspaceHeartbeatSettings = { |
| 4468 | enabled: hasEnabledUpdate ? settings.enabled! : (currentSettings?.enabled ?? true), |
| 4469 | intervalMs: hasIntervalUpdate |
| 4470 | ? settings.intervalMs! |
nothing calls this directly
no test coverage detected