@ktfun/pulse-protocol 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"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"}
package/dist/device.js ADDED
@@ -0,0 +1,304 @@
1
+ import { z } from "zod";
2
+ import { CaptureInfoSchema, DeviceStreamStoppedReasonSchema, IsoDateTimeSchema, MediaClockSchema, MediaItemSchema, StreamBlockedReasonSchema, StreamCodecSchema, StreamFormatSchema, } from "./shared";
3
+ export const DEVICE_CONNECTION_PROTOCOL = "device.connection.v1";
4
+ export const DEVICE_MEDIA_CONNECTION_PROTOCOL = "device.media.connection.v1";
5
+ export const DEVICE_MEDIA_PROTOCOL = "device.media.v1";
6
+ export const PRESENCE_PROTOCOL = "presence.v2";
7
+ export const DeviceCommonConnectionHelloFrameSchema = z.object({
8
+ protocol: z.literal(DEVICE_CONNECTION_PROTOCOL),
9
+ type: z.literal("hello"),
10
+ payload: z.object({
11
+ device: z.object({
12
+ name: z.string().min(1),
13
+ platform: z.enum(["macos", "windows", "linux", "other"]),
14
+ appVersion: z.string().min(1).optional(),
15
+ mode: z.string().min(1).optional(),
16
+ displayName: z.string().min(1).optional(),
17
+ }),
18
+ capabilities: z.object({
19
+ focusApp: z.boolean(),
20
+ windowTitle: z.boolean(),
21
+ pageTitle: z.boolean(),
22
+ pageUrl: z.boolean(),
23
+ }),
24
+ supportedProtocols: z.array(z.string().min(1)).min(1),
25
+ }),
26
+ });
27
+ export const DeviceCommonConnectionHelloAckFrameSchema = z.object({
28
+ protocol: z.literal(DEVICE_CONNECTION_PROTOCOL),
29
+ type: z.literal("hello_ack"),
30
+ payload: z.discriminatedUnion("accepted", [
31
+ z.object({
32
+ accepted: z.literal(true),
33
+ serverTime: IsoDateTimeSchema,
34
+ connectionId: z.string().min(1),
35
+ deviceSessionId: z.string().min(1),
36
+ selectedProtocols: z.array(z.string().min(1)),
37
+ }),
38
+ z.object({
39
+ accepted: z.literal(false),
40
+ serverTime: IsoDateTimeSchema,
41
+ error: z.object({
42
+ code: z.string().min(1),
43
+ message: z.string(),
44
+ }),
45
+ }),
46
+ ]),
47
+ });
48
+ export const CommonPresenceStateSchema = z.object({
49
+ availability: z.object({
50
+ state: z.enum(["active", "idle"]),
51
+ idleSeconds: z.number().nonnegative().optional(),
52
+ }),
53
+ focus: z.object({
54
+ app: z
55
+ .object({
56
+ name: z.string().min(1).optional(),
57
+ id: z.string().min(1).optional(),
58
+ category: z.string().min(1).optional(),
59
+ window: z
60
+ .object({
61
+ title: z.string().min(1).optional(),
62
+ })
63
+ .optional(),
64
+ page: z
65
+ .object({
66
+ title: z.string().min(1).optional(),
67
+ url: z.string().min(1).optional(),
68
+ })
69
+ .optional(),
70
+ })
71
+ .optional(),
72
+ }),
73
+ });
74
+ const PresenceEventPayloadBaseSchema = z.object({
75
+ eventId: z.string().min(1),
76
+ seq: z.number().int().nonnegative(),
77
+ observedAt: IsoDateTimeSchema,
78
+ sentAt: IsoDateTimeSchema,
79
+ });
80
+ export const PresenceSnapshotFrameSchema = z.object({
81
+ protocol: z.literal(PRESENCE_PROTOCOL),
82
+ type: z.literal("snapshot"),
83
+ payload: PresenceEventPayloadBaseSchema.extend({
84
+ state: CommonPresenceStateSchema,
85
+ }),
86
+ });
87
+ export const PresenceHeartbeatFrameSchema = z.object({
88
+ protocol: z.literal(PRESENCE_PROTOCOL),
89
+ type: z.literal("heartbeat"),
90
+ payload: PresenceEventPayloadBaseSchema,
91
+ });
92
+ export const PresenceSessionEndFrameSchema = z.object({
93
+ protocol: z.literal(PRESENCE_PROTOCOL),
94
+ type: z.literal("session_end"),
95
+ payload: PresenceEventPayloadBaseSchema.extend({
96
+ reason: z
97
+ .enum(["app_shutdown", "logout", "sleep", "network_change", "unknown"])
98
+ .optional(),
99
+ }),
100
+ });
101
+ export const DeviceMediaConnectionHelloFrameSchema = z.object({
102
+ protocol: z.literal(DEVICE_MEDIA_CONNECTION_PROTOCOL),
103
+ type: z.literal("hello"),
104
+ payload: z.object({
105
+ capabilities: z.object({
106
+ media: z.boolean(),
107
+ localPlayback: z.boolean(),
108
+ remotePlayback: z.boolean(),
109
+ binaryAudio: z.boolean().optional(),
110
+ localRingBuffer: z.boolean().optional(),
111
+ localRingBufferSeconds: z.number().int().positive().optional(),
112
+ }),
113
+ audio: z.object({
114
+ codecs: z.array(StreamCodecSchema).min(1),
115
+ chunkDurationMs: z.number().int().positive().optional(),
116
+ }),
117
+ supportedProtocols: z.array(z.string().min(1)).min(1),
118
+ }),
119
+ });
120
+ export const DeviceMediaConnectionHelloAckFrameSchema = z.object({
121
+ protocol: z.literal(DEVICE_MEDIA_CONNECTION_PROTOCOL),
122
+ type: z.literal("hello_ack"),
123
+ payload: z.discriminatedUnion("accepted", [
124
+ z.object({
125
+ accepted: z.literal(true),
126
+ serverTime: IsoDateTimeSchema,
127
+ connectionId: z.string().min(1),
128
+ selectedProtocols: z.array(z.string().min(1)),
129
+ capabilities: z.object({
130
+ streaming: z.boolean(),
131
+ }),
132
+ }),
133
+ z.object({
134
+ accepted: z.literal(false),
135
+ serverTime: IsoDateTimeSchema,
136
+ error: z.object({
137
+ code: z.string().min(1),
138
+ message: z.string(),
139
+ }),
140
+ }),
141
+ ]),
142
+ });
143
+ export const DeviceStreamStateSchema = z.object({
144
+ permission: z.enum(["allow", "disallow"]),
145
+ playback: z.enum(["playing", "paused"]),
146
+ capture: z.enum(["capturing", "no-capture"]),
147
+ streamFormat: StreamFormatSchema.optional(),
148
+ reason: StreamBlockedReasonSchema.optional(),
149
+ message: z.string().optional(),
150
+ });
151
+ export const DeviceStreamStateUpdatedFrameSchema = z.object({
152
+ protocol: z.literal(DEVICE_MEDIA_PROTOCOL),
153
+ type: z.literal("stream.state.updated"),
154
+ payload: z.object({
155
+ sentAt: IsoDateTimeSchema,
156
+ state: DeviceStreamStateSchema,
157
+ }),
158
+ });
159
+ export const DeviceMediaUpdatedFrameSchema = z.object({
160
+ protocol: z.literal(DEVICE_MEDIA_PROTOCOL),
161
+ type: z.literal("media.updated"),
162
+ payload: z.object({
163
+ sentAt: IsoDateTimeSchema,
164
+ media: MediaItemSchema,
165
+ clock: MediaClockSchema.optional(),
166
+ }),
167
+ });
168
+ export const DeviceMediaCommandFrameSchema = z.object({
169
+ protocol: z.literal(DEVICE_MEDIA_PROTOCOL),
170
+ type: z.literal("command"),
171
+ payload: z.object({
172
+ commandId: z.string().min(1),
173
+ sentAt: IsoDateTimeSchema,
174
+ expiresAt: IsoDateTimeSchema,
175
+ command: z.discriminatedUnion("type", [
176
+ z.object({
177
+ type: z.literal("stream.requested"),
178
+ streamId: z.string().min(1),
179
+ generation: z.number().int().nonnegative(),
180
+ }),
181
+ z.object({
182
+ type: z.literal("stream.resume"),
183
+ streamId: z.string().min(1),
184
+ generation: z.number().int().nonnegative(),
185
+ fromSeq: z.number().int().nonnegative(),
186
+ }),
187
+ z.object({
188
+ type: z.literal("stream.stop"),
189
+ reason: z.string().min(1),
190
+ }),
191
+ ]),
192
+ }),
193
+ });
194
+ export const DeviceMediaCommandAckFrameSchema = z.object({
195
+ protocol: z.literal(DEVICE_MEDIA_PROTOCOL),
196
+ type: z.literal("ack"),
197
+ payload: z.union([
198
+ z.object({
199
+ commandId: z.string().min(1),
200
+ commandType: z.literal("stream.requested"),
201
+ status: z.literal("accepted"),
202
+ streamId: z.string().min(1),
203
+ generation: z.number().int().nonnegative(),
204
+ firstSeq: z.number().int().nonnegative(),
205
+ capture: CaptureInfoSchema.optional(),
206
+ streamFormat: StreamFormatSchema,
207
+ sentAt: IsoDateTimeSchema,
208
+ }),
209
+ z.object({
210
+ commandId: z.string().min(1),
211
+ commandType: z.literal("stream.resume"),
212
+ status: z.literal("accepted"),
213
+ streamId: z.string().min(1),
214
+ generation: z.number().int().nonnegative(),
215
+ firstSeq: z.number().int().nonnegative(),
216
+ unavailableBeforeSeq: z.number().int().nonnegative().optional(),
217
+ capture: CaptureInfoSchema.optional(),
218
+ streamFormat: StreamFormatSchema.optional(),
219
+ sentAt: IsoDateTimeSchema,
220
+ }),
221
+ z.object({
222
+ commandId: z.string().min(1),
223
+ commandType: z.enum(["stream.requested", "stream.resume"]),
224
+ status: z.literal("rejected"),
225
+ rejectedReason: StreamBlockedReasonSchema,
226
+ sentAt: IsoDateTimeSchema,
227
+ }),
228
+ z.object({
229
+ commandId: z.string().min(1),
230
+ commandType: z.literal("stream.stop"),
231
+ status: z.literal("stopped"),
232
+ streamId: z.string().min(1),
233
+ generation: z.number().int().nonnegative(),
234
+ sentAt: IsoDateTimeSchema,
235
+ }),
236
+ ]),
237
+ });
238
+ export const DeviceMediaAudioChunkFrameSchema = z.object({
239
+ protocol: z.literal(DEVICE_MEDIA_PROTOCOL),
240
+ type: z.literal("audio.chunk"),
241
+ payload: z.object({
242
+ streamId: z.string().min(1),
243
+ generation: z.number().int().nonnegative(),
244
+ seq: z.number().int().nonnegative(),
245
+ sentAt: IsoDateTimeSchema,
246
+ durationMs: z.number().int().positive(),
247
+ byteLength: z.number().int().nonnegative(),
248
+ clock: MediaClockSchema.optional(),
249
+ }),
250
+ });
251
+ export const DeviceMediaStreamHeartbeatFrameSchema = z.object({
252
+ protocol: z.literal(DEVICE_MEDIA_PROTOCOL),
253
+ type: z.literal("stream.heartbeat"),
254
+ payload: z.object({
255
+ streamId: z.string().min(1),
256
+ generation: z.number().int().nonnegative(),
257
+ sentAt: IsoDateTimeSchema,
258
+ lastSeq: z.number().int().nonnegative(),
259
+ clock: MediaClockSchema.optional(),
260
+ capture: CaptureInfoSchema.optional(),
261
+ }),
262
+ });
263
+ export const DeviceMediaStreamStoppedFrameSchema = z.object({
264
+ protocol: z.literal(DEVICE_MEDIA_PROTOCOL),
265
+ type: z.literal("stream.stopped"),
266
+ payload: z.object({
267
+ streamId: z.string().min(1),
268
+ generation: z.number().int().nonnegative(),
269
+ reason: DeviceStreamStoppedReasonSchema,
270
+ sentAt: IsoDateTimeSchema,
271
+ }),
272
+ });
273
+ export const DeviceMediaErrorFrameSchema = z.object({
274
+ protocol: z.literal(DEVICE_MEDIA_PROTOCOL),
275
+ type: z.literal("error"),
276
+ payload: z.object({
277
+ sentAt: IsoDateTimeSchema,
278
+ error: z.object({
279
+ code: z.string().min(1),
280
+ message: z.string(),
281
+ }),
282
+ }),
283
+ });
284
+ export const DeviceCommonClientFrameSchema = z.discriminatedUnion("type", [
285
+ DeviceCommonConnectionHelloFrameSchema,
286
+ PresenceSnapshotFrameSchema,
287
+ PresenceHeartbeatFrameSchema,
288
+ PresenceSessionEndFrameSchema,
289
+ ]);
290
+ export const DeviceCommonServerFrameSchema = DeviceCommonConnectionHelloAckFrameSchema;
291
+ export const DeviceMediaClientFrameSchema = z.discriminatedUnion("type", [
292
+ DeviceMediaConnectionHelloFrameSchema,
293
+ DeviceStreamStateUpdatedFrameSchema,
294
+ DeviceMediaUpdatedFrameSchema,
295
+ DeviceMediaCommandAckFrameSchema,
296
+ DeviceMediaAudioChunkFrameSchema,
297
+ DeviceMediaStreamHeartbeatFrameSchema,
298
+ DeviceMediaStreamStoppedFrameSchema,
299
+ DeviceMediaErrorFrameSchema,
300
+ ]);
301
+ export const DeviceMediaServerFrameSchema = z.discriminatedUnion("type", [
302
+ DeviceMediaConnectionHelloAckFrameSchema,
303
+ DeviceMediaCommandFrameSchema,
304
+ ]);
@@ -0,0 +1,6 @@
1
+ export * from "./shared";
2
+ export * from "./common";
3
+ export * from "./page";
4
+ export * from "./media";
5
+ export * from "./device";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./shared";
2
+ export * from "./common";
3
+ export * from "./page";
4
+ export * from "./media";
5
+ export * from "./device";