Skip to main content

Whiteboard server integration

EduSDK receives classroom whiteboard credentials during entry. This page covers direct backend management of whiteboard services: shared-room tokens, recording, captures and conversion.

Configure the whiteboard client​

Node.js example; use the equivalent whiteboardClient accessor in other languages:

import { Eduskit } from '@eduskit/server-sdk';

const sdk = new Eduskit({
whiteboardClient: {
baseUrl: process.env.WB_SERVER_URL,
appId: process.env.WB_APP_ID,
appKey: process.env.WB_APP_KEY,
appSecret: process.env.WB_APP_SECRET,
},
});

All environment variables above are required. WB_SERVER_URL is the whiteboard server-api endpoint, locally http://localhost:3012. Use credentials from the whiteboard application.

Standard methods​

MethodHTTP
auth.issueRoomTokenLOCAL HS256 (eduskit-room)
recordings.startPOST /v1/rooms/recording/start
recordings.stopPOST /v1/rooms/recording/stop
recordings.listGET /v1/rooms/recordings
recordings.getGET /v1/recordings
recordings.registerMediaAssetPOST /v1/recordings/media-assets
recordings.deleteMediaAssetDELETE /v1/recordings/media-assets
recordings.enqueueVideoExportPOST /v1/recordings/video-exports
recordings.getVideoExportGET /v1/recordings/video-exports
captures.createPOST /v1/rooms/captures
captures.listGET /v1/rooms/captures
files.convertPOST /v1/files/convert
files.getConvertJobGET /v1/files/convert

Recording and conversion​

Use an actual whiteboard roomId that your business is authorized to manage. Start and stop should run at their respective business actions; this example shows their order:

const recording = await sdk.whiteboardClient.recordings.start(roomId, {
externalRef: 'lesson-001',
});
// Run the following when the business decides to stop recording.
await sdk.whiteboardClient.recordings.stop(roomId, {
recordingId: recording.recordingId,
});
const exportJob = await sdk.whiteboardClient.recordings.enqueueVideoExport(recording.recordingId, {
profile: 'hd',
});
const exportStatus = await sdk.whiteboardClient.recordings.getVideoExport(exportJob.jobId);
const convertJob = await sdk.whiteboardClient.files.convert({
sourceUrl: 'https://example.com/lesson.pptx',
fileName: 'lesson.pptx',
});
const conversion = await sdk.whiteboardClient.files.getConvertJob(convertJob.jobId);

Submit a separate export job to generate video. Export and conversion run asynchronously; retrieve results through status queries or callbacks. Conversion requires sourceUrl or objectKey, with a URL accessible to the service.

Room and private-workspace APIs​

Node.js 0.1.5 and source builds for all five languages provide the following APIs. Configure a compatible whiteboard service, business authorization and object storage. attachCourseware binds room courseware; the remaining methods manage private rooms and snapshots. The teaching blackboard is not yet available.

MethodHTTP
rooms.provisionPrivateRoomPOST /v1/rooms/private
rooms.changePrivateRoomGrantPOST /v1/rooms/private/grants
rooms.getPrivateRoomAccessPOST /v1/rooms/private/access/query
rooms.issuePrivateRoomTokenPOST /v1/rooms/private/token
rooms.sealPrivateRoomPOST /v1/rooms/private/seal
rooms.createFrozenSnapshotPOST /v1/rooms/private/snapshots
rooms.initializePrivateWorkspacePOST /v1/rooms/private/initializations
rooms.getPrivateWorkspaceInitializationPOST /v1/rooms/private/initializations/query
rooms.getFrozenSnapshotPOST /v1/rooms/private/snapshots/query
rooms.getFrozenSnapshotDownloadPOST /v1/rooms/private/snapshots/download
rooms.attachCoursewarePOST /v1/rooms/coursewares
rooms.schedulePrivateRoomWritesPOST /v1/rooms/private/write-window

The private-room sequence is: initialize a workspace → wait for ready → assign access and a write window → obtain a server-issued private token → seal writes → create a frozen snapshot → wait for ready before requesting a download URL.

sourceSnapshotId must be explicit: use null (Python None, Go nil) for an empty document, or an existing snapshot ID to copy it. Grant changes use requestId and expectedGeneration; retries of the same request must preserve every field. Keep generation, expectedGeneration, frozenSeq and sizeBytes as decimal strings.

opensAt / closesAt are UTC ISO strings with millisecond precision. A write window cannot be extended or reopened. A grant alone does not enable writes. The server reads the generation for private tokens; callers cannot specify it. Frozen-snapshot download URLs expire after 60 seconds and are not permanent asset addresses.