@yongdall/api-device 0.0.0-stage → 0.7.17
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.
- package/index.d.mts +2 -0
- package/index.mjs +2 -0
- package/lib.mjs +55 -0
- package/lib.mjs.map +1 -0
- package/package.json +28 -3
- package/yongdall/route@api.mjs +82 -0
- package/yongdall/route@api.mjs.map +1 -0
- package/yongdall.plugin.yml +1 -0
- package/README.md +0 -3
package/index.d.mts
ADDED
package/index.mjs
ADDED
package/lib.mjs
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Param, k99Context } from "@yongdall/http";
|
|
2
|
+
import { DeviceError } from "@yongdall/device";
|
|
3
|
+
import { createStore } from "@yongdall/context";
|
|
4
|
+
//#region device/api-device/lib.mts
|
|
5
|
+
const [getDevice, setDevice] = createStore(null);
|
|
6
|
+
function useDevice() {
|
|
7
|
+
const dev = getDevice();
|
|
8
|
+
if (!dev) throw DeviceError.driverNotFound;
|
|
9
|
+
return dev;
|
|
10
|
+
}
|
|
11
|
+
const channelParam = new Param();
|
|
12
|
+
const capabilityParam = new Param();
|
|
13
|
+
const triggerParam = new Param();
|
|
14
|
+
const methodParam = new Param();
|
|
15
|
+
const eventParam = new Param();
|
|
16
|
+
const propertyParam = new Param();
|
|
17
|
+
const libraryParam = new Param();
|
|
18
|
+
const libraryItemParam = new Param();
|
|
19
|
+
function useChannel() {
|
|
20
|
+
const ctx = k99Context();
|
|
21
|
+
return ctx && channelParam.param(ctx) || "";
|
|
22
|
+
}
|
|
23
|
+
function useCapability() {
|
|
24
|
+
const ctx = k99Context();
|
|
25
|
+
if (!ctx) return "";
|
|
26
|
+
return ctx && capabilityParam.param(ctx) || "";
|
|
27
|
+
}
|
|
28
|
+
function useTrigger() {
|
|
29
|
+
const ctx = k99Context();
|
|
30
|
+
return ctx && triggerParam.param(ctx) || "";
|
|
31
|
+
}
|
|
32
|
+
function useMethod() {
|
|
33
|
+
const ctx = k99Context();
|
|
34
|
+
return ctx && methodParam.param(ctx) || "";
|
|
35
|
+
}
|
|
36
|
+
function useEvent() {
|
|
37
|
+
const ctx = k99Context();
|
|
38
|
+
return ctx && eventParam.param(ctx) || "";
|
|
39
|
+
}
|
|
40
|
+
function useProperty() {
|
|
41
|
+
const ctx = k99Context();
|
|
42
|
+
return ctx && propertyParam.param(ctx) || "";
|
|
43
|
+
}
|
|
44
|
+
function useLibrary() {
|
|
45
|
+
const ctx = k99Context();
|
|
46
|
+
return ctx && libraryParam.param(ctx) || "";
|
|
47
|
+
}
|
|
48
|
+
function useLibraryItem() {
|
|
49
|
+
const ctx = k99Context();
|
|
50
|
+
return ctx && libraryItemParam.param(ctx) || "";
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { capabilityParam, channelParam, eventParam, getDevice, libraryItemParam, libraryParam, methodParam, propertyParam, setDevice, triggerParam, useCapability, useChannel, useDevice, useEvent, useLibrary, useLibraryItem, useMethod, useProperty, useTrigger };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=lib.mjs.map
|
package/lib.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.mjs","names":[],"sources":["../../device/api-device/lib.mts"],"sourcesContent":["import { createStore } from '@yongdall/context';\nimport type { Capability, Device } from '@yongdall/device';\nimport { DeviceError } from '@yongdall/device';\nimport { Param, k99Context } from '@yongdall/http';\n\nexport const [getDevice, setDevice] = createStore<Device<any, any> | null>(null);\n\nexport function useDevice<\n\tTCapabilities extends { [K in keyof TCapabilities]: Capability } = Record<string, Capability.Type>,\n\tTCapability extends Capability = Capability.Type\n>(): Device<TCapabilities, TCapability> {\n\tconst dev = getDevice();\n\tif (!dev) { throw DeviceError.driverNotFound; }\n\treturn dev\n}\nexport const channelParam = new Param();\nexport const capabilityParam = new Param();\nexport const triggerParam = new Param();\nexport const methodParam = new Param();\nexport const eventParam = new Param();\nexport const propertyParam = new Param();\nexport const libraryParam = new Param();\nexport const libraryItemParam = new Param();\nexport function useChannel() {\n\tconst ctx = k99Context();\n\treturn ctx && channelParam.param(ctx) || '';\n}\nexport function useCapability() {\n\tconst ctx = k99Context();\n\tif (!ctx) { return ''; }\n\treturn ctx && capabilityParam.param(ctx) || '';\n}\nexport function useTrigger() {\n\tconst ctx = k99Context();\n\treturn ctx && triggerParam.param(ctx) || '';\n}\nexport function useMethod() {\n\tconst ctx = k99Context();\n\treturn ctx && methodParam.param(ctx) || '';\n}\nexport function useEvent() {\n\tconst ctx = k99Context();\n\treturn ctx && eventParam.param(ctx) || '';\n}\nexport function useProperty() {\n\tconst ctx = k99Context();\n\treturn ctx && propertyParam.param(ctx) || '';\n}\nexport function useLibrary() {\n\tconst ctx = k99Context();\n\treturn ctx && libraryParam.param(ctx) || '';\n}\nexport function useLibraryItem() {\n\tconst ctx = k99Context();\n\treturn ctx && libraryItemParam.param(ctx) || '';\n}\n\nexport interface AuthResult {\n\n}\n"],"mappings":";;;;AAKA,MAAa,CAAC,WAAW,aAAa,YAAqC,IAAI;AAE/E,SAAgB,YAGwB;CACvC,MAAM,MAAM,UAAU;CACtB,IAAI,CAAC,KAAO,MAAM,YAAY;CAC9B,OAAO;AACR;AACA,MAAa,eAAe,IAAI,MAAM;AACtC,MAAa,kBAAkB,IAAI,MAAM;AACzC,MAAa,eAAe,IAAI,MAAM;AACtC,MAAa,cAAc,IAAI,MAAM;AACrC,MAAa,aAAa,IAAI,MAAM;AACpC,MAAa,gBAAgB,IAAI,MAAM;AACvC,MAAa,eAAe,IAAI,MAAM;AACtC,MAAa,mBAAmB,IAAI,MAAM;AAC1C,SAAgB,aAAa;CAC5B,MAAM,MAAM,WAAW;CACvB,OAAO,OAAO,aAAa,MAAM,GAAG,KAAK;AAC1C;AACA,SAAgB,gBAAgB;CAC/B,MAAM,MAAM,WAAW;CACvB,IAAI,CAAC,KAAO,OAAO;CACnB,OAAO,OAAO,gBAAgB,MAAM,GAAG,KAAK;AAC7C;AACA,SAAgB,aAAa;CAC5B,MAAM,MAAM,WAAW;CACvB,OAAO,OAAO,aAAa,MAAM,GAAG,KAAK;AAC1C;AACA,SAAgB,YAAY;CAC3B,MAAM,MAAM,WAAW;CACvB,OAAO,OAAO,YAAY,MAAM,GAAG,KAAK;AACzC;AACA,SAAgB,WAAW;CAC1B,MAAM,MAAM,WAAW;CACvB,OAAO,OAAO,WAAW,MAAM,GAAG,KAAK;AACxC;AACA,SAAgB,cAAc;CAC7B,MAAM,MAAM,WAAW;CACvB,OAAO,OAAO,cAAc,MAAM,GAAG,KAAK;AAC3C;AACA,SAAgB,aAAa;CAC5B,MAAM,MAAM,WAAW;CACvB,OAAO,OAAO,aAAa,MAAM,GAAG,KAAK;AAC1C;AACA,SAAgB,iBAAiB;CAChC,MAAM,MAAM,WAAW;CACvB,OAAO,OAAO,iBAAiB,MAAM,GAAG,KAAK;AAC9C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yongdall/api-device",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.7.17",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./index.mjs",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./index.mjs"
|
|
8
|
+
},
|
|
9
|
+
"imports": {
|
|
10
|
+
"#lib": "./lib.mjs"
|
|
11
|
+
},
|
|
12
|
+
"description": "",
|
|
13
|
+
"keywords": [],
|
|
14
|
+
"author": "",
|
|
15
|
+
"license": "ISC",
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@yongdall/cli-parse": "^0.7.13",
|
|
18
|
+
"@yongdall/common": "^0.7.17",
|
|
19
|
+
"@yongdall/configuration": "^0.7.13",
|
|
20
|
+
"@yongdall/context": "^0.7.13",
|
|
21
|
+
"@yongdall/device": "^0.7.17",
|
|
22
|
+
"@yongdall/core": "^0.7.13",
|
|
23
|
+
"@yongdall/http": "^0.7.17",
|
|
24
|
+
"@yongdall/plugins": "^0.7.13",
|
|
25
|
+
"@yongdall/process": "^0.7.13"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@yongdall/cli": "^0.7.13",
|
|
29
|
+
"@yongdall/types": "^0.7.13"
|
|
30
|
+
}
|
|
6
31
|
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ServerError } from "@yongdall/core";
|
|
2
|
+
import { ApiRouter, apiRoute, authenticate, k99Context, useBody } from "@yongdall/http";
|
|
3
|
+
import { getDevice } from "@yongdall/device";
|
|
4
|
+
import { getFilenameFromContentDisposition, toJsonlTransformStream } from "@yongdall/common";
|
|
5
|
+
import { capabilityParam, channelParam, eventParam, libraryItemParam, libraryParam, methodParam, propertyParam, setDevice, triggerParam, useCapability, useChannel, useDevice, useEvent, useLibrary, useLibraryItem, useMethod, useProperty, useTrigger } from "#lib";
|
|
6
|
+
//#region device/api-device/yongdall/route@api.mts
|
|
7
|
+
const device = new ApiRouter();
|
|
8
|
+
device.route(apiRoute("device"));
|
|
9
|
+
device.guard(async (ctx) => {
|
|
10
|
+
const { requestHeaders } = ctx;
|
|
11
|
+
const targetUri = requestHeaders.get("Yongdall-Device-Uri");
|
|
12
|
+
const WWWAuthenticate = await authenticate("device", { target: targetUri }, requestHeaders.get("Authorization"));
|
|
13
|
+
if (typeof WWWAuthenticate === "string") {
|
|
14
|
+
ctx.responseHeaders.set("WWW-Authenticate", WWWAuthenticate);
|
|
15
|
+
throw new ServerError("Unauthorized", 401);
|
|
16
|
+
}
|
|
17
|
+
setDevice(getDevice(targetUri || ""));
|
|
18
|
+
});
|
|
19
|
+
const fileMimes = /* @__PURE__ */ new Set([
|
|
20
|
+
"image/jpeg",
|
|
21
|
+
"image/png",
|
|
22
|
+
"image/gif"
|
|
23
|
+
]);
|
|
24
|
+
async function getBody() {
|
|
25
|
+
let data = await useBody();
|
|
26
|
+
if (data instanceof FormData) {
|
|
27
|
+
const obj = {};
|
|
28
|
+
for (const [key, val] of data) obj[key] = Object.hasOwn(obj, key) ? [obj[key], val].flat() : val;
|
|
29
|
+
return obj;
|
|
30
|
+
}
|
|
31
|
+
if (data != null) return data;
|
|
32
|
+
const request = k99Context()?.request;
|
|
33
|
+
if (!request) return null;
|
|
34
|
+
if (request.bodyUsed) return null;
|
|
35
|
+
const headers = request.headers;
|
|
36
|
+
const mime = headers.get("Content-Type")?.replace(/\s/g, "").split(";")[0] || "";
|
|
37
|
+
if (!fileMimes.has(mime)) return null;
|
|
38
|
+
const filename = getFilenameFromContentDisposition(headers.get("Content-Disposition"));
|
|
39
|
+
if (!filename) return request.blob();
|
|
40
|
+
return new File([await request.blob()], filename, { type: mime });
|
|
41
|
+
}
|
|
42
|
+
device.get`channels`(() => useDevice().channels());
|
|
43
|
+
device.get`info`(() => useDevice().getInfo());
|
|
44
|
+
device.get`net/address`(() => useDevice().getNetAddress());
|
|
45
|
+
device.post`ping`(() => useDevice().ping());
|
|
46
|
+
device.post`reboot`(() => useDevice().reboot().then(() => ({})));
|
|
47
|
+
function toTemporal(value) {
|
|
48
|
+
try {
|
|
49
|
+
return Temporal.ZonedDateTime.from(value);
|
|
50
|
+
} catch {}
|
|
51
|
+
throw new ServerError("Invalid value", 400);
|
|
52
|
+
}
|
|
53
|
+
device.post`methods/${methodParam}`(() => getBody().then((options) => useDevice().callMethod(useMethod(), options)));
|
|
54
|
+
device.get`time`(() => useDevice().getTime().then((time) => time.toString()));
|
|
55
|
+
device.post`time`(() => getBody().then(toTemporal).then((time) => useDevice().setTime(time)).then(() => ({})));
|
|
56
|
+
device.get`ntp/status`(() => useDevice().getNTPStatus());
|
|
57
|
+
device.post`ntp/status`(() => useDevice().setNTPStatus(true).then(() => ({})));
|
|
58
|
+
device.put`ntp/status`(async (ctx) => useBody().then((enabled) => useDevice().setNTPStatus(Boolean(enabled))).then(() => ({})));
|
|
59
|
+
device.delete`ntp/status`(() => useDevice().setNTPStatus(false).then(() => ({})));
|
|
60
|
+
device.get`ntp/server`(() => useDevice().getNTP());
|
|
61
|
+
device.put`ntp/server`(async (ctx) => useBody().then((ntp) => useDevice().setNTP([ntp].flat())).then(() => ({})));
|
|
62
|
+
const channel = device.route`channels/${channelParam}`();
|
|
63
|
+
const channelCapability = new ApiRouter();
|
|
64
|
+
channel.route`capabilities/${capabilityParam}`(new ApiRouter());
|
|
65
|
+
channelCapability.post`triggers/${triggerParam}`(() => getBody().then((options) => useDevice().trigger(useChannel(), useCapability(), useTrigger(), options)).then(() => ({})));
|
|
66
|
+
channelCapability.post`methods/${methodParam}`(() => getBody().then((options) => useDevice().execMethod(useChannel(), useCapability(), useMethod(), options)));
|
|
67
|
+
channelCapability.get`events/${eventParam}`((ctx) => useDevice().listenEvent(useChannel(), useCapability(), useEvent()).then((stream) => {
|
|
68
|
+
ctx.responseType = "application/jsonl";
|
|
69
|
+
return stream.pipeThrough(toJsonlTransformStream());
|
|
70
|
+
}));
|
|
71
|
+
channelCapability.query`events/${eventParam}`(() => getBody().then((options) => useDevice().queryEvents(useChannel(), useCapability(), useEvent(), options)));
|
|
72
|
+
channelCapability.get`properties/${propertyParam}`(() => useDevice().getProperty(useChannel(), useCapability(), useProperty()));
|
|
73
|
+
channelCapability.put`properties/${propertyParam}`(() => getBody().then((value) => useDevice().setProperty(useChannel(), useCapability(), useProperty(), value)).then(() => ({})));
|
|
74
|
+
channelCapability.query`libraries/${libraryParam}/items`(() => getBody().then((options) => useDevice().queryLibraryItem(useChannel(), useCapability(), useLibrary(), options)));
|
|
75
|
+
channelCapability.post`libraries/${libraryParam}/items`(() => getBody().then((value) => useDevice().addLibraryItem(useChannel(), useCapability(), useLibrary(), value)).then(() => ({})));
|
|
76
|
+
channelCapability.get`libraries/${libraryParam}/items/${libraryItemParam}`(() => useDevice().getLibraryItem(useChannel(), useCapability(), useLibrary(), useLibraryItem()));
|
|
77
|
+
channelCapability.put`libraries/${libraryParam}/items/${libraryItemParam}`(() => getBody().then((value) => useDevice().setLibraryItem(useChannel(), useCapability(), useLibrary(), useLibraryItem(), value)).then(() => ({})));
|
|
78
|
+
channelCapability.delete`libraries/${libraryParam}/items/${libraryItemParam}`(() => useDevice().deleteLibraryItem(useChannel(), useCapability(), useLibrary(), useLibraryItem()).then(() => ({})));
|
|
79
|
+
//#endregion
|
|
80
|
+
export { device };
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=route@api.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route@api.mjs","names":[],"sources":["../../../device/api-device/yongdall/route@api.mts"],"sourcesContent":["import type { AuthResult } from '#lib';\nimport { ServerError } from '@yongdall/core';\nimport { ApiRouter, apiRoute, authenticate, k99Context, useBody } from '@yongdall/http';\nimport { DeviceError, getDevice } from '@yongdall/device';\nimport { getFilenameFromContentDisposition, toJsonlTransformStream } from '@yongdall/common';\nimport {\n\tsetDevice,\n\tcapabilityParam, channelParam, eventParam, libraryItemParam, libraryParam, methodParam, propertyParam, triggerParam, \n\tuseCapability, useChannel, useDevice, useEvent, useLibrary, useLibraryItem, useMethod, useProperty, useTrigger,\n} from '#lib';\n\nexport const device = new ApiRouter();\n\ndevice.route(apiRoute('device'));\n\ndevice.guard(async (ctx) => {\n\tconst { requestHeaders } = ctx;\n\tconst targetUri = requestHeaders.get('Yongdall-Device-Uri');\n\tconst WWWAuthenticate = await authenticate<AuthResult>('device', {\n\t\ttarget: targetUri,\n\t}, requestHeaders.get('Authorization'));\n\tif (typeof WWWAuthenticate === 'string') {\n\t\tctx.responseHeaders.set('WWW-Authenticate', WWWAuthenticate);\n\t\tthrow new ServerError('Unauthorized', 401);\n\t}\n\tsetDevice(getDevice(targetUri || ''));\n});\nconst fileMimes = new Set([\n\t'image/jpeg',\n\t'image/png',\n\t'image/gif',\n])\nasync function getBody() {\n\tlet data = await useBody();\n\tif (data instanceof FormData) {\n\t\tconst obj: Record<string, string | File | (string | File)[]> = {};\n\t\tfor (const [key, val] of data) {\n\t\t\tobj[key] = Object.hasOwn(obj, key) ? [obj[key], val].flat() : val;\n\t\t}\n\t\treturn obj;\n\t}\n\tif (data != null) { return data; }\n\tconst request = k99Context()?.request;\n\tif (!request) { return null; }\n\tif (request.bodyUsed) { return null; }\n\tconst headers = request.headers;\n\tconst mime = headers.get('Content-Type')?.replace(/\\s/g, '').split(';')[0] || '';\n\tif (!fileMimes.has(mime)) { return null; }\n\tconst filename = getFilenameFromContentDisposition(headers.get('Content-Disposition'));\n\tif (!filename) { return request.blob(); }\n\treturn new File([await request.blob()], filename, { type: mime });\n}\n\ndevice.get`channels`(() => useDevice().channels());\ndevice.get`info`(() => useDevice().getInfo());\ndevice.get`net/address`(() => useDevice().getNetAddress());\ndevice.post`ping`(() => useDevice().ping());\ndevice.post`reboot`(() => useDevice().reboot().then(() => ({})));\n\n\nfunction toTemporal(value: any) {\n\ttry { return Temporal.ZonedDateTime.from(value); } catch { }\n\tthrow new ServerError('Invalid value', 400);\n}\ndevice.post`methods/${methodParam}`(() => getBody()\n\t.then(options => useDevice().callMethod(useMethod(), options))\n);\n\ndevice.get`time`(() => useDevice().getTime().then(time => time.toString()));\ndevice.post`time`(() => getBody().then(toTemporal).then(time => useDevice().setTime(time)).then(() => ({})));\ndevice.get`ntp/status`(() => useDevice().getNTPStatus());\ndevice.post`ntp/status`(() => useDevice().setNTPStatus(true).then(() => ({})));\ndevice.put`ntp/status`(async ctx => useBody().then(enabled => useDevice().setNTPStatus(Boolean(enabled))).then(() => ({})));\ndevice.delete`ntp/status`(() => useDevice().setNTPStatus(false).then(() => ({})));\ndevice.get`ntp/server`(() => useDevice().getNTP())\ndevice.put`ntp/server`(async ctx => useBody().then(ntp => useDevice().setNTP([ntp].flat())).then(() => ({})));\n\nconst channel = device.route`channels/${channelParam}`();\nconst channelCapability = new ApiRouter();\nchannel.route`capabilities/${capabilityParam}`(new ApiRouter);\n\n\n\nchannelCapability.post`triggers/${triggerParam}`(() => getBody()\n\t.then(options => useDevice().trigger(useChannel(), useCapability(), useTrigger(), options))\n\t.then(() => ({}))\n);\n\n\n\nchannelCapability.post`methods/${methodParam}`(() => getBody()\n\t.then(options => useDevice().execMethod(useChannel(), useCapability(), useMethod(), options))\n);\n\n\nchannelCapability.get`events/${eventParam}`(ctx =>\n\tuseDevice().listenEvent(useChannel(), useCapability(), useEvent())\n\t.then(stream => {\n\t\tctx.responseType = 'application/jsonl';\n\t\treturn stream.pipeThrough(toJsonlTransformStream());\n\t})\n);\nchannelCapability.query`events/${eventParam}`(() => getBody()\n\t.then(options => useDevice().queryEvents(useChannel(), useCapability(), useEvent(), options))\n);\n\n\n\nchannelCapability.get`properties/${propertyParam}`(() => useDevice()\n\t.getProperty(useChannel(), useCapability(), useProperty())\n);\nchannelCapability.put`properties/${propertyParam}`(() => getBody()\n\t.then(value => useDevice().setProperty(useChannel(), useCapability(), useProperty(), value))\n\t.then(() => ({}))\n);\n\n\n\nchannelCapability.query`libraries/${libraryParam}/items`(() => getBody()\n\t.then(options => useDevice().queryLibraryItem(useChannel(), useCapability(), useLibrary(), options))\n);\nchannelCapability.post`libraries/${libraryParam}/items`(() => getBody()\n\t.then(value => useDevice().addLibraryItem(useChannel(), useCapability(), useLibrary(), value))\n\t.then(() => ({}))\n);\n\nchannelCapability.get`libraries/${libraryParam}/items/${libraryItemParam}`(() => useDevice()\n\t.getLibraryItem(useChannel(), useCapability(), useLibrary(), useLibraryItem())\n);\nchannelCapability.put`libraries/${libraryParam}/items/${libraryItemParam}`(() => getBody()\n\t.then(value => useDevice().setLibraryItem(useChannel(), useCapability(), useLibrary(), useLibraryItem(), value))\n\t.then(() => ({}))\n);\nchannelCapability.delete`libraries/${libraryParam}/items/${libraryItemParam}`(() => useDevice()\n\t.deleteLibraryItem(useChannel(), useCapability(), useLibrary(), useLibraryItem())\n\t.then(() => ({}))\n);\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
label: 设备服务
|
package/README.md
DELETED