Flowcore SDK
The Flowcore SDK is a TypeScript library that provides a robust interface for interacting with the Flowcore API.
Installation
bunx jsr add @flowcore/sdk
deno add jsr:@flowcore/sdk
npx jsr add @flowcore/sdk
Getting Started
Client Configuration
The FlowcoreClient can be initialized in several ways:
import { FlowcoreClient } from "@flowcore/sdk"
// 1. With a bearer tokenconst clientWithBearer = new FlowcoreClient({ getBearerToken: async (): Promise<string> => { const token = await someMethodToGetToken() return token },})
// 2. With an API keyconst clientWithApiKey = new FlowcoreClient({ apiKeyId: "my-api-key-id", apiKey: "my-api-key",})
// 3. With retry configurationconst clientWithRetry = new FlowcoreClient({ apiKeyId: "my-api-key-id", apiKey: "my-api-key", retry: { delay: 100, // Delay in milliseconds between retries maxRetries: 5, // Maximum number of retry attempts },})
API Reference
Tenant Operations
Fetch a Tenant
You can fetch a Tenant either by ID or by name:
import { TenantFetchCommand, FlowcoreClient } from "@flowcore/sdk"
// Fetch by IDconst fetchById = new TenantFetchCommand({ tenantId: "your-tenant-id"})
// Fetch by nameconst fetchByName = new TenantFetchCommand({ tenant: "your-tenant-name"})
const result = await client.execute(fetchById) // or fetchByName// Returns a Tenant object:// {// id: string;// name: string;// displayName: string;// description: string;// website: string;// }
List Tenants
import { TenantListCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new TenantListCommand({})
const tenants = await client.execute(command)// Returns an array of TenantWithLinkType objects:// {// id: string;// name: string;// displayName: string;// description: string;// website: string;// linkType: "OWNER" | "COLLABORATOR";// }
API Key Management
Create an API Key
import { ApiKeyCreateCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new ApiKeyCreateCommand({ tenantId: "your-tenant-id", name: "my-new-api-key"})
const result = await client.execute(command)// Result will contain:// {// id: string;// name: string;// createdAt: string;// value: string; // The API key value - store this securely!// }
List API Keys
import { ApiKeyListCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new ApiKeyListCommand({ tenantId: "your-tenant-id"})
const apiKeys = await client.execute(command)// Returns an array of:// {// id: string;// name: string;// createdAt: string;// }
Delete an API Key
import { ApiKeyDeleteCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new ApiKeyDeleteCommand({ tenantId: "your-tenant-id", apiKeyId: "api-key-id-to-delete"})
const result = await client.execute(command)// Returns true if deletion was successful
Secret Operations
Create a Secret
import { SecretCreateCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new SecretCreateCommand({ tenantId: "your-tenant-id", key: "MY_SECRET_KEY", value: "my-secret-value"})
const result = await client.execute(command)// Returns: boolean indicating if creation was successful
List Secrets
import { SecretListCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new SecretListCommand({ tenantId: "your-tenant-id"})
const secrets = await client.execute(command)// Returns an array of secret keys (not values):// string[]
Delete a Secret
import { SecretDeleteCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new SecretDeleteCommand({ tenantId: "your-tenant-id", key: "MY_SECRET_KEY"})
const result = await client.execute(command)// Returns: boolean indicating if deletion was successful
Variable Operations
Create a Variable
import { VariableCreateCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new VariableCreateCommand({ tenantId: "your-tenant-id", key: "MY_VARIABLE_KEY", value: "my-variable-value"})
const result = await client.execute(command)// Returns the created Variable:// {// key: string;// value: string;// }
List Variables
import { VariableListCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new VariableListCommand({ tenantId: "your-tenant-id"})
const variables = await client.execute(command)// Returns an array of Variables:// {// key: string;// value: string;// }[]
Delete a Variable
import { VariableDeleteCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new VariableDeleteCommand({ tenantId: "your-tenant-id", key: "MY_VARIABLE_KEY"})
const result = await client.execute(command)// Returns: boolean indicating if deletion was successful
Data Core Operations
Create a Data Core
import { DataCoreCreateCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new DataCoreCreateCommand({ tenantId: "your-tenant-id", name: "my-data-core", description: "My awesome data core", accessControl: "private", deleteProtection: true})
const result = await client.execute(command)// Returns the created DataCore object:// {// id: string;// name: string;// description: string;// accessControl: "public" | "private";// deleteProtection: boolean;// createdAt: string;// updatedAt: string;// }
Fetch a Data Core
You can fetch a Data Core either by ID or by name:
import { DataCoreFetchCommand, FlowcoreClient } from "@flowcore/sdk"
// Fetch by IDconst fetchById = new DataCoreFetchCommand({ dataCoreId: "your-data-core-id"})
// Fetch by nameconst fetchByName = new DataCoreFetchCommand({ tenantId: "your-tenant-id", dataCore: "your-data-core-name"})
const result = await client.execute(fetchById) // or fetchByName
List Data Cores
import { DataCoreListCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new DataCoreListCommand({ tenantId: "your-tenant-id", // Optional: Filter by tenant ID tenant: "tenant-name" // Optional: Filter by tenant name})
const dataCores = await client.execute(command)// Returns an array of DataCore objects
Update a Data Core
import { DataCoreUpdateCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new DataCoreUpdateCommand({ dataCoreId: "your-data-core-id", description: "Updated description", // Optional accessControl: "public", // Optional deleteProtection: false // Optional})
const updatedDataCore = await client.execute(command)
Check if a Data Core Exists
import { DataCoreExistsCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new DataCoreExistsCommand({ dataCoreId: "your-data-core-id"})
const result = await client.execute(command)// Returns: { exists: boolean }
Delete a Data Core
import { DataCoreDeleteRequestCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new DataCoreDeleteRequestCommand({ dataCoreId: "your-data-core-id", waitForDelete: true // Optional: Wait for deletion to complete (default: true)})
const result = await client.execute(command)// Returns: boolean indicating if deletion was successful
Flow Type Operations
Create a Flow Type
import { FlowTypeCreateCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new FlowTypeCreateCommand({ dataCoreId: "your-data-core-id", name: "my-flow-type", description: "My awesome flow type"})
const result = await client.execute(command)// Returns the created FlowType object:// {// id: string;// name: string;// description: string;// dataCoreId: string;// createdAt: string;// updatedAt: string;// }
Fetch a Flow Type
You can fetch a Flow Type either by ID or by name:
import { FlowTypeFetchCommand, FlowcoreClient } from "@flowcore/sdk"
// Fetch by IDconst fetchById = new FlowTypeFetchCommand({ flowTypeId: "your-flow-type-id"})
// Fetch by nameconst fetchByName = new FlowTypeFetchCommand({ dataCoreId: "your-data-core-id", flowType: "your-flow-type-name"})
const result = await client.execute(fetchById) // or fetchByName
List Flow Types
import { FlowTypeListCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new FlowTypeListCommand({ dataCoreId: "your-data-core-id"})
const flowTypes = await client.execute(command)// Returns an array of FlowType objects
Update a Flow Type
import { FlowTypeUpdateCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new FlowTypeUpdateCommand({ flowTypeId: "your-flow-type-id", description: "Updated description" // Optional})
const updatedFlowType = await client.execute(command)
Check if a Flow Type Exists
import { FlowTypeExistsCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new FlowTypeExistsCommand({ flowTypeId: "your-flow-type-id"})
const result = await client.execute(command)// Returns: { exists: boolean }
Delete a Flow Type
import { FlowTypeDeleteRequestCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new FlowTypeDeleteRequestCommand({ flowTypeId: "your-flow-type-id", waitForDelete: true // Optional: Wait for deletion to complete (default: true)})
const result = await client.execute(command)// Returns: boolean indicating if deletion was successful
Event Type Operations
Create an Event Type
import { EventTypeCreateCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new EventTypeCreateCommand({ flowTypeId: "your-flow-type-id", name: "my-event-type", description: "My awesome event type"})
const result = await client.execute(command)// Returns the created EventType object:// {// id: string;// name: string;// description: string;// flowTypeId: string;// createdAt: string;// updatedAt: string;// }
Fetch an Event Type
You can fetch an Event Type either by ID or by name:
import { EventTypeFetchCommand, FlowcoreClient } from "@flowcore/sdk"
// Fetch by IDconst fetchById = new EventTypeFetchCommand({ eventTypeId: "your-event-type-id"})
// Fetch by nameconst fetchByName = new EventTypeFetchCommand({ flowTypeId: "your-flow-type-id", eventType: "your-event-type-name"})
const result = await client.execute(fetchById) // or fetchByName
List Event Types
import { EventTypeListCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new EventTypeListCommand({ flowTypeId: "your-flow-type-id"})
const eventTypes = await client.execute(command)// Returns an array of EventType objects
Update an Event Type
import { EventTypeUpdateCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new EventTypeUpdateCommand({ eventTypeId: "your-event-type-id", description: "Updated description" // Optional})
const updatedEventType = await client.execute(command)
Check if an Event Type Exists
import { EventTypeExistsCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new EventTypeExistsCommand({ eventTypeId: "your-event-type-id"})
const result = await client.execute(command)// Returns: { exists: boolean }
Delete an Event Type
import { EventTypeDeleteRequestCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new EventTypeDeleteRequestCommand({ eventTypeId: "your-event-type-id", waitForDelete: true // Optional: Wait for deletion to complete (default: true)})
const result = await client.execute(command)// Returns: boolean indicating if deletion was successful
Truncate an Event Type
import { EventTypeTruncateRequestCommand, FlowcoreClient } from "@flowcore/sdk"
const command = new EventTypeTruncateRequestCommand({ eventTypeId: "your-event-type-id", waitForTruncate: true // Optional: Wait for truncation to complete (default: true)})
const result = await client.execute(command)// Returns: boolean indicating if truncation was successful
Notifications
The NotificationClient allows you to receive real-time notifications when events are ingested into an event type. The notifications follow the hierarchical structure: Data Core → Flow Type → Event Type.
Setting up Notifications
import { NotificationClient, type NotificationEvent } from "@flowcore/sdk"import { Subject } from "rxjs"
// Create an RxJS Subject to handle the notificationsconst subject = new Subject<NotificationEvent>()
// Subscribe to handle notificationssubject.subscribe({ next: (event) => { console.log("Received event:", event) // event.data contains: // { // tenant: string; // Tenant ID // eventId: string; // Unique event ID // dataCoreId: string; // Data Core ID // flowType: string; // Flow Type name // eventType: string; // Event Type name // validTime: string; // Timestamp // } }, error: (error) => console.error("Error:", error), complete: () => console.log("Notification stream completed")})
// Create the notification clientconst client = new NotificationClient( subject, oidcClient, // Your OIDC client for authentication { tenant: "your-tenant-name", dataCore: "your-data-core-name", flowType: "your-flow-type-name", // Optional: Subscribe to specific flow type eventType: "your-event-type-name" // Optional: Subscribe to specific event type }, { reconnectInterval: 1000, // Optional: Milliseconds between reconnection attempts maxReconnects: 5, // Optional: Maximum number of reconnection attempts maxEvents: 1000, // Optional: Maximum number of events to receive logger: customLogger // Optional: Custom logger implementation })
// Connect to start receiving notificationsawait client.connect()
// Disconnect when doneclient.disconnect()
Configuration Options
- reconnectInterval: Time in milliseconds between reconnection attempts (default: 1000)
- maxReconnects: Maximum number of reconnection attempts (optional)
- maxEvents: Maximum number of events to receive before auto-disconnecting (optional)
- logger: Custom logger implementation (optional)
Subscription Specification
You can narrow down your notification subscription by specifying:
- tenant: Required - The tenant name
- dataCore: Required - The data core name
- flowType: Optional - Specific flow type to monitor
- eventType: Optional - Specific event type to monitor (requires flowType to be specified)