@kusinta/iot-schema 0.1.0-beta.2 → 0.1.0-beta.21

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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/package.json +10 -2
  4. package/src/kusinta/iot/access/v1/acl_pb.d.ts +3 -3
  5. package/src/kusinta/iot/access/v1/acl_pb.js +3 -3
  6. package/src/kusinta/iot/access/v1/roles_pb.d.ts +1 -1
  7. package/src/kusinta/iot/access/v1/roles_pb.js +1 -1
  8. package/src/kusinta/iot/common/v1/types_pb.d.ts +1 -1
  9. package/src/kusinta/iot/common/v1/types_pb.js +1 -1
  10. package/src/kusinta/iot/connector/v1/connector_pb.d.ts +31 -24
  11. package/src/kusinta/iot/connector/v1/connector_pb.js +16 -15
  12. package/src/kusinta/iot/connector/v1/connector_service_pb.d.ts +6 -6
  13. package/src/kusinta/iot/connector/v1/connector_service_pb.js +3 -3
  14. package/src/kusinta/iot/device/v1/descriptor_pb.d.ts +3 -3
  15. package/src/kusinta/iot/device/v1/descriptor_pb.js +3 -3
  16. package/src/kusinta/iot/device/v1/device_pb.d.ts +36 -4
  17. package/src/kusinta/iot/device/v1/device_pb.js +4 -4
  18. package/src/kusinta/iot/device/v1/matter_options_pb.d.ts +46 -0
  19. package/src/kusinta/iot/device/v1/matter_options_pb.js +50 -0
  20. package/src/kusinta/iot/device/v1/properties_pb.d.ts +175 -208
  21. package/src/kusinta/iot/device/v1/properties_pb.js +3 -2
  22. package/src/kusinta/iot/device/v1/property_update_pb.d.ts +38 -5
  23. package/src/kusinta/iot/device/v1/property_update_pb.js +2 -2
  24. package/src/kusinta/iot/identity/v1/identity_pb.d.ts +1 -1
  25. package/src/kusinta/iot/identity/v1/identity_pb.js +1 -1
  26. package/src/kusinta/iot/registration/v1/registration_pb.d.ts +170 -0
  27. package/src/kusinta/iot/registration/v1/registration_pb.js +61 -0
  28. package/src/kusinta/iot/registration/v1/registration_service_pb.d.ts +34 -0
  29. package/src/kusinta/iot/registration/v1/registration_service_pb.js +19 -0
  30. package/src/kusinta/iot/signaling/v1/signaling_pb.d.ts +320 -0
  31. package/src/kusinta/iot/signaling/v1/signaling_pb.js +83 -0
  32. package/src/kusinta/iot/signaling/v1/signaling_service_pb.d.ts +34 -0
  33. package/src/kusinta/iot/signaling/v1/signaling_service_pb.js +19 -0
  34. package/src/kusinta/iot/space/v1/space_pb.d.ts +3 -3
  35. package/src/kusinta/iot/space/v1/space_pb.js +3 -3
  36. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.d.ts +16 -11
  37. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.js +2 -2
  38. package/src/kusinta/iot/webrtc/v1/app_token_pb.d.ts +152 -0
  39. package/src/kusinta/iot/webrtc/v1/app_token_pb.js +28 -0
  40. package/src/kusinta/iot/webrtc/v1/command_pb.d.ts +4 -4
  41. package/src/kusinta/iot/webrtc/v1/command_pb.js +2 -2
  42. package/src/kusinta/iot/webrtc/v1/device_state_pb.d.ts +69 -6
  43. package/src/kusinta/iot/webrtc/v1/device_state_pb.js +20 -5
  44. package/src/kusinta/iot/webrtc/v1/envelope_pb.d.ts +365 -17
  45. package/src/kusinta/iot/webrtc/v1/envelope_pb.js +79 -11
  46. package/src/kusinta/iot/webrtc/v1/management_pb.d.ts +451 -0
  47. package/src/kusinta/iot/webrtc/v1/management_pb.js +106 -0
  48. package/src/kusinta/iot/webrtc/v1/permission_push_pb.d.ts +10 -4
  49. package/src/kusinta/iot/webrtc/v1/permission_push_pb.js +3 -3
  50. package/src/__tests__/access.test.js +0 -134
  51. package/src/__tests__/common.test.js +0 -29
  52. package/src/__tests__/connector.test.js +0 -144
  53. package/src/__tests__/device.test.js +0 -194
  54. package/src/__tests__/identity.test.js +0 -43
  55. package/src/__tests__/space.test.js +0 -54
  56. package/src/__tests__/vendor.test.js +0 -60
  57. package/src/__tests__/webrtc.test.js +0 -268
@@ -1,268 +0,0 @@
1
- // @ts-check
2
- import { describe, it, expect } from 'vitest'
3
- import { create, toBinary, fromBinary } from '@bufbuild/protobuf'
4
- import {
5
- GatewayMessageSchema,
6
- AppMessageSchema,
7
- AppHandshakeSchema,
8
- } from '../kusinta/iot/webrtc/v1/envelope_pb.js'
9
- import { DeviceCommandSchema, CommandResultSchema } from '../kusinta/iot/webrtc/v1/command_pb.js'
10
- import { DeviceStateSnapshotSchema, DevicePropertyEventSchema } from '../kusinta/iot/webrtc/v1/device_state_pb.js'
11
- import { LivePermissionUpdateSchema } from '../kusinta/iot/webrtc/v1/permission_push_pb.js'
12
-
13
- describe('AppHandshake', () => {
14
- it('round-trips jwt and subscribe_device_ids', () => {
15
- const h = create(AppHandshakeSchema, {
16
- jwt: 'eyJhbGciOiJSUzI1NiJ9.test.sig',
17
- subscribeDeviceIds: [{ value: 'dev-1' }, { value: 'dev-2' }],
18
- })
19
- const decoded = fromBinary(AppHandshakeSchema, toBinary(AppHandshakeSchema, h))
20
- expect(decoded.jwt).toBe('eyJhbGciOiJSUzI1NiJ9.test.sig')
21
- expect(decoded.subscribeDeviceIds).toHaveLength(2)
22
- expect(decoded.subscribeDeviceIds[0].value).toBe('dev-1')
23
- })
24
- })
25
-
26
- describe('DeviceCommand', () => {
27
- it('round-trips thermostat setpoint command', () => {
28
- const cmd = create(DeviceCommandSchema, {
29
- commandId: 'cmd-uuid-1',
30
- deviceId: { value: 'therm-1' },
31
- clusterIdHex: '0201',
32
- commandName: 'SetpointRaiseLower',
33
- parameters: { case: 'thermostatSetpoint', value: { mode: 4, amount: 50 } },
34
- })
35
- const decoded = fromBinary(DeviceCommandSchema, toBinary(DeviceCommandSchema, cmd))
36
- expect(decoded.commandId).toBe('cmd-uuid-1')
37
- expect(decoded.deviceId?.value).toBe('therm-1')
38
- expect(decoded.commandName).toBe('SetpointRaiseLower')
39
- expect(decoded.parameters?.case).toBe('thermostatSetpoint')
40
- if (decoded.parameters?.case === 'thermostatSetpoint') {
41
- expect(decoded.parameters.value.mode).toBe(4)
42
- expect(decoded.parameters.value.amount).toBe(50)
43
- }
44
- })
45
-
46
- it('round-trips on/off command', () => {
47
- const cmd = create(DeviceCommandSchema, {
48
- commandId: 'cmd-uuid-2',
49
- deviceId: { value: 'light-1' },
50
- clusterIdHex: '0006',
51
- commandName: 'Toggle',
52
- parameters: { case: 'onOff', value: { toggle: true } },
53
- })
54
- const decoded = fromBinary(DeviceCommandSchema, toBinary(DeviceCommandSchema, cmd))
55
- expect(decoded.parameters?.case).toBe('onOff')
56
- if (decoded.parameters?.case === 'onOff') {
57
- expect(decoded.parameters.value.toggle).toBe(true)
58
- }
59
- })
60
-
61
- it('round-trips level control command', () => {
62
- const cmd = create(DeviceCommandSchema, {
63
- commandId: 'cmd-uuid-3',
64
- deviceId: { value: 'light-2' },
65
- clusterIdHex: '0008',
66
- commandName: 'MoveToLevel',
67
- parameters: { case: 'levelControl', value: { level: 127, transitionTime: 10 } },
68
- })
69
- const decoded = fromBinary(DeviceCommandSchema, toBinary(DeviceCommandSchema, cmd))
70
- expect(decoded.parameters?.case).toBe('levelControl')
71
- if (decoded.parameters?.case === 'levelControl') {
72
- expect(decoded.parameters.value.level).toBe(127)
73
- expect(decoded.parameters.value.transitionTime).toBe(10)
74
- }
75
- })
76
-
77
- it('round-trips window covering lift command', () => {
78
- const cmd = create(DeviceCommandSchema, {
79
- commandId: 'cmd-uuid-4',
80
- deviceId: { value: 'blind-1' },
81
- clusterIdHex: '0102',
82
- commandName: 'GoToLiftPercentage',
83
- parameters: { case: 'windowCoveringLift', value: { liftPercent100ths: 5000 } },
84
- })
85
- const decoded = fromBinary(DeviceCommandSchema, toBinary(DeviceCommandSchema, cmd))
86
- expect(decoded.parameters?.case).toBe('windowCoveringLift')
87
- if (decoded.parameters?.case === 'windowCoveringLift') {
88
- expect(decoded.parameters.value.liftPercent100ths).toBe(5000)
89
- }
90
- })
91
-
92
- it('round-trips door lock command', () => {
93
- const cmd = create(DeviceCommandSchema, {
94
- commandId: 'cmd-uuid-5',
95
- deviceId: { value: 'lock-1' },
96
- clusterIdHex: '0101',
97
- commandName: 'LockDoor',
98
- parameters: { case: 'doorLock', value: { lockState: 1 } },
99
- })
100
- const decoded = fromBinary(DeviceCommandSchema, toBinary(DeviceCommandSchema, cmd))
101
- expect(decoded.parameters?.case).toBe('doorLock')
102
- if (decoded.parameters?.case === 'doorLock') {
103
- expect(decoded.parameters.value.lockState).toBe(1)
104
- }
105
- })
106
- })
107
-
108
- describe('CommandResult', () => {
109
- it('round-trips successful result', () => {
110
- const result = create(CommandResultSchema, { commandId: 'cmd-uuid-1', success: true })
111
- const decoded = fromBinary(CommandResultSchema, toBinary(CommandResultSchema, result))
112
- expect(decoded.commandId).toBe('cmd-uuid-1')
113
- expect(decoded.success).toBe(true)
114
- })
115
-
116
- it('round-trips failed result with error', () => {
117
- const result = create(CommandResultSchema, {
118
- commandId: 'cmd-uuid-2',
119
- success: false,
120
- error: { code: 'PERMISSION_DENIED', message: 'Setpoint exceeds property-owner limit' },
121
- })
122
- const decoded = fromBinary(CommandResultSchema, toBinary(CommandResultSchema, result))
123
- expect(decoded.success).toBe(false)
124
- expect(decoded.error?.code).toBe('PERMISSION_DENIED')
125
- })
126
- })
127
-
128
- describe('DeviceStateSnapshot', () => {
129
- it('round-trips with devices and permissions', () => {
130
- const snap = create(DeviceStateSnapshotSchema, {
131
- devices: [{
132
- descriptor: { deviceId: { value: 'therm-1' }, matterDeviceTypeId: 0x0301 },
133
- properties: { case: 'thermostat', value: { occupiedHeatingSetpoint: 2100 } },
134
- }],
135
- permissions: { userId: { value: 'user-1' }, gatewayId: { value: 'gw-1' }, deviceAcls: [] },
136
- })
137
- const decoded = fromBinary(DeviceStateSnapshotSchema, toBinary(DeviceStateSnapshotSchema, snap))
138
- expect(decoded.devices).toHaveLength(1)
139
- expect(decoded.devices[0].descriptor?.deviceId?.value).toBe('therm-1')
140
- expect(decoded.permissions?.userId?.value).toBe('user-1')
141
- })
142
- })
143
-
144
- describe('DevicePropertyEvent', () => {
145
- it('round-trips a property update event', () => {
146
- const event = create(DevicePropertyEventSchema, {
147
- update: {
148
- deviceId: { value: 'therm-1' },
149
- attributeName: 'LocalTemperature',
150
- value: { case: 'intValue', value: 2050 },
151
- clusterIdHex: '0402',
152
- },
153
- })
154
- const decoded = fromBinary(DevicePropertyEventSchema, toBinary(DevicePropertyEventSchema, event))
155
- expect(decoded.update?.attributeName).toBe('LocalTemperature')
156
- expect(decoded.update?.value?.case).toBe('intValue')
157
- })
158
- })
159
-
160
- describe('LivePermissionUpdate', () => {
161
- it('round-trips added and removed devices', () => {
162
- const update = create(LivePermissionUpdateSchema, {
163
- newPermissions: { userId: { value: 'user-1' }, gatewayId: { value: 'gw-1' }, deviceAcls: [] },
164
- addedDevices: [{ value: 'dev-new-1' }],
165
- removedDevices: [{ value: 'dev-old-1' }],
166
- changeReason: 'DEVICE_ASSIGNED',
167
- })
168
- const decoded = fromBinary(LivePermissionUpdateSchema, toBinary(LivePermissionUpdateSchema, update))
169
- expect(decoded.addedDevices).toHaveLength(1)
170
- expect(decoded.addedDevices[0].value).toBe('dev-new-1')
171
- expect(decoded.removedDevices).toHaveLength(1)
172
- expect(decoded.changeReason).toBe('DEVICE_ASSIGNED')
173
- })
174
- })
175
-
176
- describe('GatewayMessage oneof payload', () => {
177
- it('round-trips state_snapshot payload', () => {
178
- const msg = create(GatewayMessageSchema, {
179
- messageId: 'gw-msg-001',
180
- payload: {
181
- case: 'stateSnapshot',
182
- value: {
183
- devices: [],
184
- permissions: { userId: { value: 'user-1' }, gatewayId: { value: 'gw-1' }, deviceAcls: [] },
185
- },
186
- },
187
- })
188
- const decoded = fromBinary(GatewayMessageSchema, toBinary(GatewayMessageSchema, msg))
189
- expect(decoded.messageId).toBe('gw-msg-001')
190
- expect(decoded.payload?.case).toBe('stateSnapshot')
191
- })
192
-
193
- it('round-trips property_event payload', () => {
194
- const msg = create(GatewayMessageSchema, {
195
- messageId: 'gw-msg-002',
196
- payload: {
197
- case: 'propertyEvent',
198
- value: {
199
- update: {
200
- deviceId: { value: 'therm-1' },
201
- attributeName: 'OccupiedHeatingSetpoint',
202
- value: { case: 'intValue', value: 2100 },
203
- clusterIdHex: '0201',
204
- },
205
- },
206
- },
207
- })
208
- const decoded = fromBinary(GatewayMessageSchema, toBinary(GatewayMessageSchema, msg))
209
- expect(decoded.payload?.case).toBe('propertyEvent')
210
- if (decoded.payload?.case === 'propertyEvent') {
211
- expect(decoded.payload.value.update?.attributeName).toBe('OccupiedHeatingSetpoint')
212
- }
213
- })
214
-
215
- it('round-trips pong payload', () => {
216
- const msg = create(GatewayMessageSchema, {
217
- messageId: 'gw-msg-003',
218
- payload: { case: 'pong', value: {} },
219
- })
220
- const decoded = fromBinary(GatewayMessageSchema, toBinary(GatewayMessageSchema, msg))
221
- expect(decoded.payload?.case).toBe('pong')
222
- })
223
- })
224
-
225
- describe('AppMessage oneof payload', () => {
226
- it('round-trips handshake payload', () => {
227
- const msg = create(AppMessageSchema, {
228
- messageId: 'app-msg-001',
229
- payload: {
230
- case: 'handshake',
231
- value: { jwt: 'token.payload.sig', subscribeDeviceIds: [{ value: 'dev-1' }] },
232
- },
233
- })
234
- const decoded = fromBinary(AppMessageSchema, toBinary(AppMessageSchema, msg))
235
- expect(decoded.messageId).toBe('app-msg-001')
236
- expect(decoded.payload?.case).toBe('handshake')
237
- if (decoded.payload?.case === 'handshake') {
238
- expect(decoded.payload.value.jwt).toBe('token.payload.sig')
239
- }
240
- })
241
-
242
- it('round-trips command payload', () => {
243
- const msg = create(AppMessageSchema, {
244
- messageId: 'app-msg-002',
245
- payload: {
246
- case: 'command',
247
- value: {
248
- commandId: 'cmd-1',
249
- deviceId: { value: 'light-1' },
250
- clusterIdHex: '0006',
251
- commandName: 'Toggle',
252
- parameters: { case: 'onOff', value: { toggle: true } },
253
- },
254
- },
255
- })
256
- const decoded = fromBinary(AppMessageSchema, toBinary(AppMessageSchema, msg))
257
- expect(decoded.payload?.case).toBe('command')
258
- })
259
-
260
- it('round-trips ping payload', () => {
261
- const msg = create(AppMessageSchema, {
262
- messageId: 'app-msg-003',
263
- payload: { case: 'ping', value: {} },
264
- })
265
- const decoded = fromBinary(AppMessageSchema, toBinary(AppMessageSchema, msg))
266
- expect(decoded.payload?.case).toBe('ping')
267
- })
268
- })