1k-adding-socket-events
Adds new WebSocket event subscriptions to OneKey. Use when implementing new socket events, handling server push messages, or adding real-time data subscriptions. Socket, WebSocket, event, subscription, push, real-time.
Best use case
1k-adding-socket-events is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Adds new WebSocket event subscriptions to OneKey. Use when implementing new socket events, handling server push messages, or adding real-time data subscriptions. Socket, WebSocket, event, subscription, push, real-time.
Teams using 1k-adding-socket-events should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/1k-adding-socket-events/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How 1k-adding-socket-events Compares
| Feature / Agent | 1k-adding-socket-events | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Adds new WebSocket event subscriptions to OneKey. Use when implementing new socket events, handling server push messages, or adding real-time data subscriptions. Socket, WebSocket, event, subscription, push, real-time.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Adding WebSocket Event Subscriptions
This skill documents how to add new WebSocket event subscriptions in the OneKey app.
## Overview
WebSocket events enable real-time server-to-client communication. The pattern involves:
1. Define the event name in `EAppSocketEventNames` enum
2. Define the payload type interface
3. Add the event handler in `PushProviderWebSocket`
## Key Files
| Purpose | Location |
|---------|----------|
| Event names & payload types | `packages/shared/types/socket.ts` |
| WebSocket event handlers | `packages/kit-bg/src/services/ServiceNotification/PushProvider/PushProviderWebSocket.ts` |
## Step-by-Step Guide
### Step 1: Define Event Name
Add the new event name to `EAppSocketEventNames` in `packages/shared/types/socket.ts`:
```typescript
export enum EAppSocketEventNames {
notification = 'notification',
ping = 'ping',
pong = 'pong',
ack = 'ack',
market = 'market',
primeConfigChanged = 'CONFIG_CHANGE',
// ... existing events
myNewEvent = 'MY_NEW_EVENT', // Add your new event
}
```
**Convention**: Use camelCase for the enum key, SCREAMING_SNAKE_CASE for the string value.
### Step 2: Define Payload Type
Add the payload interface in `packages/shared/types/socket.ts`:
```typescript
export interface IMyNewEventPayload {
msgId: string; // Required for acknowledgment
// Add other fields as needed
someData?: string;
someNumber?: number;
}
```
**Important**: Always include `msgId: string` for message acknowledgment.
### Step 3: Add Event Handler
In `packages/kit-bg/src/services/ServiceNotification/PushProvider/PushProviderWebSocket.ts`:
1. Import the new payload type:
```typescript
import type {
// ... existing imports
IMyNewEventPayload,
} from '@onekeyhq/shared/types/socket';
```
2. Add the event handler in `initWebSocket()` method:
```typescript
this.socket.on(EAppSocketEventNames.myNewEvent, (payload: IMyNewEventPayload) => {
// 1. Acknowledge receipt (required for most events)
void this.backgroundApi.serviceNotification.ackNotificationMessage({
msgId: payload.msgId,
action: ENotificationPushMessageAckAction.arrived,
});
// 2. Handle the event (call appropriate service method)
void this.backgroundApi.someService.handleMyNewEvent(payload);
});
```
## Complete Example: userInfoUpdated Event
Here's a real example from the codebase:
### 1. Event Name (socket.ts)
```typescript
export enum EAppSocketEventNames {
// ... other events
userInfoUpdated = 'USER_INFO_UPDATED',
}
```
### 2. Payload Type (socket.ts)
```typescript
export interface IUserInfoUpdatedPayload {
msgId: string;
}
```
### 3. Event Handler (PushProviderWebSocket.ts)
```typescript
this.socket.on(EAppSocketEventNames.userInfoUpdated, (payload: IUserInfoUpdatedPayload) => {
void this.backgroundApi.serviceNotification.ackNotificationMessage({
msgId: payload.msgId,
action: ENotificationPushMessageAckAction.arrived,
});
void this.backgroundApi.servicePrime.apiFetchPrimeUserInfo();
});
```
## Event Handler Patterns
### Simple Acknowledgment + Action
```typescript
this.socket.on(EAppSocketEventNames.myEvent, (payload: IMyPayload) => {
void this.backgroundApi.serviceNotification.ackNotificationMessage({
msgId: payload.msgId,
action: ENotificationPushMessageAckAction.arrived,
});
void this.backgroundApi.someService.doSomething();
});
```
### With Logging
```typescript
this.socket.on(EAppSocketEventNames.myEvent, (payload: IMyPayload) => {
defaultLogger.notification.websocket.consoleLog(
'WebSocket received myEvent:',
payload,
);
void this.backgroundApi.serviceNotification.ackNotificationMessage({
msgId: payload.msgId,
action: ENotificationPushMessageAckAction.arrived,
});
void this.backgroundApi.someService.doSomething(payload);
});
```
### With Validation
```typescript
this.socket.on(EAppSocketEventNames.myEvent, async (payload: IMyPayload) => {
if (!payload?.requiredField) {
console.error('myEvent ERROR: requiredField is missing', payload);
return;
}
void this.backgroundApi.serviceNotification.ackNotificationMessage({
msgId: payload.msgId,
action: ENotificationPushMessageAckAction.arrived,
});
await this.backgroundApi.someService.doSomething(payload);
});
```
### With EventBus Emission
```typescript
this.socket.on(EAppSocketEventNames.myEvent, (payload: IMyPayload) => {
void this.backgroundApi.serviceNotification.ackNotificationMessage({
msgId: payload.msgId,
action: ENotificationPushMessageAckAction.arrived,
});
appEventBus.emit(EAppEventBusNames.MyEventReceived, payload);
});
```
## Important: Message Acknowledgment
**You MUST acknowledge messages via `serviceNotification.ackNotificationMessage`**. If you don't acknowledge the `msgId`, the server will assume the message was not delivered and will retry sending it repeatedly.
```typescript
void this.backgroundApi.serviceNotification.ackNotificationMessage({
msgId: payload.msgId,
action: ENotificationPushMessageAckAction.arrived,
});
```
This should be called as early as possible in your event handler to prevent duplicate message delivery.
## Acknowledgment Actions
Available actions in `ENotificationPushMessageAckAction`:
- `arrived` - Message was received (use this for most cases)
- `clicked` - User clicked the notification
## Checklist
- [ ] Event name added to `EAppSocketEventNames` enum
- [ ] Payload interface defined with `msgId: string`
- [ ] Payload type imported in `PushProviderWebSocket.ts`
- [ ] Event handler added in `initWebSocket()` method
- [ ] **Message acknowledged via `ackNotificationMessage`** (required to prevent server retries)
- [ ] Appropriate service method called to handle the event
- [ ] Logging added if needed for debuggingRelated Skills
adding-tweets
Add tweets to the Second Brain. Use when the user provides a Twitter/X URL and pasted tweet content, asking to "add a tweet", "save this tweet", or "capture this tweet".
adding-todos
Use this skill to capture an idea, task, or issue that surfaces during a Kata session as a structured todo for later work. This skill creates markdown todo files in the .planning/todos/pending directory with relevant metadata and content extracted from the conversation. Triggers include "add todo", "capture todo", "new todo", and "create todo".
adding-stacks
Use when adding a new framework/stack to create-faster CLI tool - addresses copy-first mentality, incomplete implementations, and missing dependencies
adding-phases
Use this skill to add planned work discovered during execution to the end of the current milestone in the roadmap. This skill appends sequential phases to the current milestone's phase list, automatically calculating the next phase number. Triggers include "add phase", "append phase", "new phase", and "create phase". This skill updates ROADMAP.md and STATE.md accordingly.
adding-persistent-event
Adds a new type of event that gets persisted to the event log. Use this when adding new kinds of write operations to the system or when adding new events to existing code.
adding-notes
Add new notes to the Second Brain knowledge base. Use when the user provides a resource (URL, book, podcast, article, GitHub repo, Reddit thread) and asks to "add a note", "create a note", "save this", "add to my notes", "take notes on", or "capture this".
/mnt/data2/nhlstats/.github/skills/adding-new-sport/SKILL.md
```markdown
adding-new-metric
Guides systematic implementation of new sustainability metrics in OSS Sustain Guard using the plugin-based metric system. Use when adding metric functions to evaluate project health aspects like issue responsiveness, test coverage, or security response time.
adding-new-ai-format
Step-by-step guide for adding support for a new AI editor format to PRPM - covers types, converters, schemas, CLI, webapp, and testing
adding-nango-provider-support
Use when adding support for a new Nango provider - configures provider in providers.yaml, creates documentation (main page, setup guide, connect guide), and updates docs.json following established patterns
adding-models
Guide for adding new LLM models to Letta Code. Use when the user wants to add support for a new model, needs to know valid model handles, or wants to update the model configuration. Covers models.json configuration, CI test matrix, and handle validation.
adding-mod-parsers
Use when adding new mod parsers to convert game mod strings to typed Mod objects - guides the template-based parsing pattern (project)