Skip to content

Commit 94c7249

Browse files
committed
sdk: Add API EmitEvent
1 parent f672c73 commit 94c7249

File tree

4 files changed

+117
-0
lines changed

4 files changed

+117
-0
lines changed

sdk/curl/api.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,33 @@ curl --unix-socket /var/run/dstack.sock http://dstack/Info
165165
}
166166
```
167167

168+
### 5. Emit Event
169+
170+
Emit an event to be extended to RTMR3 on TDX platform. This API requires Dstack OS 0.5.0 or later.
171+
172+
**Endpoint:** `/EmitEvent`
173+
174+
**Request Parameters:**
175+
176+
| Field | Type | Description | Example |
177+
|-------|------|-------------|----------|
178+
| `event` | string | The event name | `"custom-event"` |
179+
| `payload` | string | Hex-encoded payload data | `"deadbeef"` |
180+
181+
**Example:**
182+
```bash
183+
curl --unix-socket /var/run/dstack.sock -X POST \
184+
http://dstack/EmitEvent \
185+
-H 'Content-Type: application/json' \
186+
-d '{
187+
"event": "custom-event",
188+
"payload": "deadbeef"
189+
}'
190+
```
191+
192+
**Response:**
193+
Empty response with HTTP 200 status code on success.
194+
168195
## Error Responses
169196

170197
All endpoints may return the following HTTP status codes:

sdk/go/dstack/client.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,3 +417,15 @@ func (c *DstackClient) Info(ctx context.Context) (*InfoResponse, error) {
417417

418418
return &response, nil
419419
}
420+
421+
// EmitEvent sends an event to be extended to RTMR3 on TDX platform.
422+
// The event will be extended to RTMR3 with the provided name and payload.
423+
//
424+
// Requires Dstack OS 0.5.0 or later.
425+
func (c *DstackClient) EmitEvent(ctx context.Context, event string, payload []byte) error {
426+
_, err := c.sendRPCRequest(ctx, "/EmitEvent", map[string]interface{}{
427+
"event": event,
428+
"payload": hex.EncodeToString(payload),
429+
})
430+
return err
431+
}

sdk/js/src/index.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,4 +314,28 @@ export class DstackClient {
314314
tcb_info: JSON.parse(result.tcb_info) as TcbInfo,
315315
})
316316
}
317+
318+
/**
319+
* Emit an event. This extends the event to RTMR3 on TDX platform.
320+
*
321+
* Requires Dstack OS 0.5.0 or later.
322+
*
323+
* @param event The event name
324+
* @param payload The event data as string or Buffer or Uint8Array
325+
*/
326+
async emitEvent(event: string, payload: string | Buffer | Uint8Array): Promise<void> {
327+
if (!event) {
328+
throw new Error('Event name cannot be empty')
329+
}
330+
331+
const hexPayload = to_hex(payload)
332+
await send_rpc_request(
333+
this.endpoint,
334+
'/EmitEvent',
335+
JSON.stringify({
336+
event: event,
337+
payload: hexPayload
338+
})
339+
)
340+
}
317341
}

sdk/python/src/dstack_sdk/dstack_client.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,33 @@ def info(self) -> InfoResponse:
203203
result = self._send_rpc_request("/Info", {})
204204
return InfoResponse.model_validate(result)
205205

206+
def emit_event(
207+
self,
208+
event: str,
209+
payload: str | bytes,
210+
) -> None:
211+
"""
212+
Emit an event. This extends the event to RTMR3 on TDX platform.
213+
214+
Requires Dstack OS 0.5.0 or later.
215+
216+
Args:
217+
event: The event name
218+
payload: The event data as string or bytes
219+
220+
Returns:
221+
None
222+
"""
223+
if not event:
224+
raise ValueError("event name cannot be empty")
225+
226+
if isinstance(payload, str):
227+
payload = payload.encode()
228+
229+
hex_payload = binascii.hexlify(payload).decode()
230+
self._send_rpc_request("/EmitEvent", {"event": event, "payload": hex_payload})
231+
return None
232+
206233
def get_tls_key(
207234
self,
208235
subject: str | None = None,
@@ -285,6 +312,33 @@ async def info(self) -> InfoResponse:
285312
result = await self._send_rpc_request("/Info", {})
286313
return InfoResponse.model_validate(result)
287314

315+
async def emit_event(
316+
self,
317+
event: str,
318+
payload: str | bytes,
319+
) -> None:
320+
"""
321+
Emit an event. This extends the event to RTMR3 on TDX platform.
322+
323+
Requires Dstack OS 0.5.0 or later.
324+
325+
Args:
326+
event: The event name
327+
payload: The event data as string or bytes
328+
329+
Returns:
330+
None
331+
"""
332+
if not event:
333+
raise ValueError("event name cannot be empty")
334+
335+
if isinstance(payload, str):
336+
payload = payload.encode()
337+
338+
hex_payload = binascii.hexlify(payload).decode()
339+
await self._send_rpc_request("/EmitEvent", {"event": event, "payload": hex_payload})
340+
return None
341+
288342
async def get_tls_key(
289343
self,
290344
subject: str | None = None,

0 commit comments

Comments
 (0)