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
| Method | HTTP |
|---|---|
auth.issueRoomToken | LOCAL HS256 (eduskit-room) |
recordings.start | POST /v1/rooms/recording/start |
recordings.stop | POST /v1/rooms/recording/stop |
recordings.list | GET /v1/rooms/recordings |
recordings.get | GET /v1/recordings |
recordings.registerMediaAsset | POST /v1/recordings/media-assets |
recordings.deleteMediaAsset | DELETE /v1/recordings/media-assets |
recordings.enqueueVideoExport | POST /v1/recordings/video-exports |
recordings.getVideoExport | GET /v1/recordings/video-exports |
captures.create | POST /v1/rooms/captures |
captures.list | GET /v1/rooms/captures |
files.convert | POST /v1/files/convert |
files.getConvertJob | GET /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.
| Method | HTTP |
|---|---|
rooms.provisionPrivateRoom | POST /v1/rooms/private |
rooms.changePrivateRoomGrant | POST /v1/rooms/private/grants |
rooms.getPrivateRoomAccess | POST /v1/rooms/private/access/query |
rooms.issuePrivateRoomToken | POST /v1/rooms/private/token |
rooms.sealPrivateRoom | POST /v1/rooms/private/seal |
rooms.createFrozenSnapshot | POST /v1/rooms/private/snapshots |
rooms.initializePrivateWorkspace | POST /v1/rooms/private/initializations |
rooms.getPrivateWorkspaceInitialization | POST /v1/rooms/private/initializations/query |
rooms.getFrozenSnapshot | POST /v1/rooms/private/snapshots/query |
rooms.getFrozenSnapshotDownload | POST /v1/rooms/private/snapshots/download |
rooms.attachCourseware | POST /v1/rooms/coursewares |
rooms.schedulePrivateRoomWrites | POST /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.