@hashsome/core 0.1.0

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 (75) hide show
  1. package/LICENSE +674 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/base-integration.d.ts +30 -0
  4. package/dist/base-integration.js +106 -0
  5. package/dist/base-integration.js.map +1 -0
  6. package/dist/client.d.ts +63 -0
  7. package/dist/client.js +199 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/codegen.d.ts +6 -0
  10. package/dist/codegen.js +19 -0
  11. package/dist/codegen.js.map +1 -0
  12. package/dist/conformance.d.ts +23 -0
  13. package/dist/conformance.js +196 -0
  14. package/dist/conformance.js.map +1 -0
  15. package/dist/emitter.d.ts +8 -0
  16. package/dist/emitter.js +18 -0
  17. package/dist/emitter.js.map +1 -0
  18. package/dist/entity.d.ts +24 -0
  19. package/dist/entity.js +21 -0
  20. package/dist/entity.js.map +1 -0
  21. package/dist/index.d.ts +9 -0
  22. package/dist/index.js +9 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/integration.d.ts +61 -0
  25. package/dist/integration.js +1 -0
  26. package/dist/integration.js.map +1 -0
  27. package/dist/local-client.d.ts +22 -0
  28. package/dist/local-client.js +121 -0
  29. package/dist/local-client.js.map +1 -0
  30. package/dist/mock.d.ts +61 -0
  31. package/dist/mock.js +448 -0
  32. package/dist/mock.js.map +1 -0
  33. package/dist/model/action.d.ts +9 -0
  34. package/dist/model/action.js +1 -0
  35. package/dist/model/action.js.map +1 -0
  36. package/dist/model/base.d.ts +21 -0
  37. package/dist/model/base.js +1 -0
  38. package/dist/model/base.js.map +1 -0
  39. package/dist/model/browse.d.ts +28 -0
  40. package/dist/model/browse.js +1 -0
  41. package/dist/model/browse.js.map +1 -0
  42. package/dist/model/climate.d.ts +37 -0
  43. package/dist/model/climate.js +1 -0
  44. package/dist/model/climate.js.map +1 -0
  45. package/dist/model/generic.d.ts +7 -0
  46. package/dist/model/generic.js +1 -0
  47. package/dist/model/generic.js.map +1 -0
  48. package/dist/model/history.d.ts +23 -0
  49. package/dist/model/history.js +1 -0
  50. package/dist/model/history.js.map +1 -0
  51. package/dist/model/index.d.ts +51 -0
  52. package/dist/model/index.js +38 -0
  53. package/dist/model/index.js.map +1 -0
  54. package/dist/model/light.d.ts +46 -0
  55. package/dist/model/light.js +1 -0
  56. package/dist/model/light.js.map +1 -0
  57. package/dist/model/media-player.d.ts +68 -0
  58. package/dist/model/media-player.js +1 -0
  59. package/dist/model/media-player.js.map +1 -0
  60. package/dist/model/person.d.ts +10 -0
  61. package/dist/model/person.js +1 -0
  62. package/dist/model/person.js.map +1 -0
  63. package/dist/model/sensor.d.ts +12 -0
  64. package/dist/model/sensor.js +1 -0
  65. package/dist/model/sensor.js.map +1 -0
  66. package/dist/model/switch.d.ts +10 -0
  67. package/dist/model/switch.js +1 -0
  68. package/dist/model/switch.js.map +1 -0
  69. package/dist/model/weather.d.ts +16 -0
  70. package/dist/model/weather.js +19 -0
  71. package/dist/model/weather.js.map +1 -0
  72. package/dist/protocol.d.ts +61 -0
  73. package/dist/protocol.js +102 -0
  74. package/dist/protocol.js.map +1 -0
  75. package/package.json +36 -0
@@ -0,0 +1,102 @@
1
+ /** Where the runtime serves files an integration's entities point at (artwork, pictures). */
2
+ export const ASSET_PATH = '/_hashsome/asset';
3
+ /** The address a browser can load a backend's own file from: the runtime fetches it with the
4
+ * integration's credentials, so the backend need not be reachable or trusted by the browser.
5
+ * `path` is the backend's own path, e.g. `/api/image/serve/…`. */
6
+ export function assetUrl(integration, path) {
7
+ return `${ASSET_PATH}/${encodeURIComponent(integration)}?path=${encodeURIComponent(path)}`;
8
+ }
9
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
10
+ const isRef = (value) => typeof value === 'string' && /^[^:]+:.+$/.test(value);
11
+ /** Parse and validate an untrusted client frame. Returns `undefined` if malformed. */
12
+ export function parseClientMessage(raw) {
13
+ let value;
14
+ try {
15
+ value = JSON.parse(raw);
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ if (!isRecord(value)) {
21
+ return undefined;
22
+ }
23
+ switch (value.type) {
24
+ case 'subscribe':
25
+ case 'unsubscribe':
26
+ return isRef(value.ref) ? { type: value.type, ref: value.ref } : undefined;
27
+ case 'command': {
28
+ if (typeof value.id !== 'number' || !isRef(value.ref) || typeof value.command !== 'string') {
29
+ return undefined;
30
+ }
31
+ if (value.args !== undefined && !isRecord(value.args)) {
32
+ return undefined;
33
+ }
34
+ return {
35
+ type: 'command',
36
+ id: value.id,
37
+ ref: value.ref,
38
+ command: value.command,
39
+ ...(value.args ? { args: value.args } : {}),
40
+ };
41
+ }
42
+ case 'query': {
43
+ if (typeof value.id !== 'number' ||
44
+ !isRef(value.ref) ||
45
+ (value.query !== 'browse' && value.query !== 'history') ||
46
+ (value.args !== undefined && !isRecord(value.args))) {
47
+ return undefined;
48
+ }
49
+ return {
50
+ type: 'query',
51
+ id: value.id,
52
+ ref: value.ref,
53
+ query: value.query,
54
+ ...(value.args ? { args: value.args } : {}),
55
+ };
56
+ }
57
+ case 'raw': {
58
+ if (typeof value.id !== 'number' ||
59
+ typeof value.integration !== 'string' ||
60
+ !isRecord(value.request)) {
61
+ return undefined;
62
+ }
63
+ return {
64
+ type: 'raw',
65
+ id: value.id,
66
+ integration: value.integration,
67
+ request: value.request,
68
+ };
69
+ }
70
+ default:
71
+ return undefined;
72
+ }
73
+ }
74
+ export function parseServerMessage(raw) {
75
+ let value;
76
+ try {
77
+ value = JSON.parse(raw);
78
+ }
79
+ catch {
80
+ return undefined;
81
+ }
82
+ if (!isRecord(value)) {
83
+ return undefined;
84
+ }
85
+ switch (value.type) {
86
+ case 'entity':
87
+ return isRef(value.ref) && (value.entity === null || isRecord(value.entity))
88
+ ? value
89
+ : undefined;
90
+ case 'status':
91
+ return typeof value.integration === 'string' && typeof value.status === 'string'
92
+ ? value
93
+ : undefined;
94
+ case 'result':
95
+ return typeof value.id === 'number' && typeof value.ok === 'boolean'
96
+ ? value
97
+ : undefined;
98
+ default:
99
+ return undefined;
100
+ }
101
+ }
102
+ export const encodeMessage = (message) => JSON.stringify(message);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@hashsome/core",
3
+ "version": "0.1.0",
4
+ "description": "Framework-agnostic integration interface, entity types and wire protocol (no vendor-specific code)",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "default": "./dist/index.js"
10
+ },
11
+ "./conformance": {
12
+ "types": "./dist/conformance.d.ts",
13
+ "default": "./dist/conformance.js"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "license": "GPL-3.0-only",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/dstoyanoff/hashsome.git",
21
+ "directory": "packages/core"
22
+ },
23
+ "homepage": "https://github.com/dstoyanoff/hashsome#readme",
24
+ "bugs": "https://github.com/dstoyanoff/hashsome/issues",
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "publishConfig": {
29
+ "access": "public",
30
+ "provenance": true
31
+ },
32
+ "scripts": {
33
+ "typecheck": "tsc --noEmit",
34
+ "build": "tsc -b tsconfig.build.json"
35
+ }
36
+ }