@livequery/honojs 2.0.145 → 2.0.149
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.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Context, Handler } from 'hono';
|
|
2
|
-
import { Observable, Subject } from 'rxjs';
|
|
2
|
+
import { Observable, Subject, Subscription } from 'rxjs';
|
|
3
3
|
import { type LivequeryDatasourceInitConfig } from '@livequery/core';
|
|
4
|
-
import type { LivequeryBaseEntity, LivequeryRequest, UpdatedData, WebsocketSyncPayload } from '@livequery/
|
|
4
|
+
import type { LivequeryBaseEntity, LivequeryRequest, UpdatedData, WebsocketSyncPayload } from '@livequery/core';
|
|
5
5
|
import type { LivequeryRoute, LivequeryResponse } from './types.js';
|
|
6
6
|
import type { LivequeryRouteRegistry } from './route-registry.js';
|
|
7
7
|
import { WebsocketGateway } from '@livequery/core';
|
|
@@ -9,24 +9,35 @@ export declare class LivequeryItemMapper<T extends LivequeryBaseEntity> {
|
|
|
9
9
|
readonly mapper: (item: T) => T;
|
|
10
10
|
constructor(mapper: (item: T) => T);
|
|
11
11
|
}
|
|
12
|
-
export type LivequeryDatasource<
|
|
13
|
-
init(
|
|
12
|
+
export type LivequeryDatasource<RouteOptions> = Subject<WebsocketSyncPayload<LivequeryBaseEntity>> & {
|
|
13
|
+
init(routes: Array<LivequeryDatasourceInitConfig<RouteOptions>>): Promise<void>;
|
|
14
14
|
query(query: LivequeryRequest, options: RouteOptions): Promise<{
|
|
15
15
|
items?: any[];
|
|
16
16
|
item?: any;
|
|
17
17
|
}>;
|
|
18
18
|
};
|
|
19
|
+
export type LivequeryDatasourceRoute<RouteOptions> = LivequeryRoute & {
|
|
20
|
+
options?: RouteOptions;
|
|
21
|
+
};
|
|
22
|
+
export type LivequeryWatcherRoute<RouteOptions> = {
|
|
23
|
+
path: string;
|
|
24
|
+
method: string;
|
|
25
|
+
schema: string;
|
|
26
|
+
options: RouteOptions;
|
|
27
|
+
};
|
|
19
28
|
export type LivequeryDatasourceWatcher<Config, RouteOptions> = {
|
|
20
|
-
watch(config: Config, routes: Array<
|
|
29
|
+
watch(config: Config, routes: Array<LivequeryWatcherRoute<RouteOptions>>, ds: LivequeryDatasource<RouteOptions>): Observable<UpdatedData<any>>;
|
|
21
30
|
};
|
|
22
31
|
export type CreateDatasourceOptions<Config, RouteOptions> = {
|
|
23
|
-
datasource: LivequeryDatasource<
|
|
32
|
+
datasource: LivequeryDatasource<RouteOptions>;
|
|
24
33
|
watcher?: LivequeryDatasourceWatcher<Config, RouteOptions>;
|
|
25
34
|
websocketGateway?: WebsocketGateway;
|
|
26
|
-
routes:
|
|
27
|
-
config
|
|
35
|
+
routes: Array<LivequeryDatasourceRoute<RouteOptions>> | LivequeryRouteRegistry;
|
|
36
|
+
config?: Config | Promise<Config>;
|
|
28
37
|
};
|
|
29
|
-
export declare function createDatasourceMapper<Config, RouteOptions>(options: CreateDatasourceOptions<Config, RouteOptions>): Promise<(routeOptions: RouteOptions, mapper?: DatasourceMapper) => Handler
|
|
38
|
+
export declare function createDatasourceMapper<Config, RouteOptions>(options: CreateDatasourceOptions<Config, RouteOptions>): Promise<((routeOptions: RouteOptions, mapper?: DatasourceMapper) => Handler) & {
|
|
39
|
+
realtime: Subscription | undefined;
|
|
40
|
+
}>;
|
|
30
41
|
export type DatasourceMapper = LivequeryItemMapper<any> | ((result: {
|
|
31
42
|
items?: any[];
|
|
32
43
|
item?: any;
|
package/build/src/datasource.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { hidePrivateFields } from '@livequery/core';
|
|
1
|
+
import { hidePrivateFields, LivequeryRequestParser } from '@livequery/core';
|
|
2
2
|
import { getLivequeryRequest } from './request.js';
|
|
3
3
|
import { livequeryJson } from './response.js';
|
|
4
4
|
export class LivequeryItemMapper {
|
|
@@ -7,27 +7,59 @@ export class LivequeryItemMapper {
|
|
|
7
7
|
this.mapper = mapper;
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
+
function parseRouteSchema(path) {
|
|
11
|
+
try {
|
|
12
|
+
const normalized = path.split('/').filter(Boolean).join('/');
|
|
13
|
+
return LivequeryRequestParser.parse({
|
|
14
|
+
ref: normalized,
|
|
15
|
+
path: normalized,
|
|
16
|
+
params: {},
|
|
17
|
+
query: {},
|
|
18
|
+
method: 'GET',
|
|
19
|
+
headers: new Map(),
|
|
20
|
+
})?.schema;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
10
26
|
export async function createDatasourceMapper(options) {
|
|
11
27
|
const routes = Array.isArray(options.routes) ? options.routes : options.routes.routes;
|
|
12
|
-
const config = await options.config;
|
|
13
28
|
const datasourceRoutes = routes.map(route => ({
|
|
14
29
|
path: route.path,
|
|
15
30
|
method: route.method,
|
|
16
|
-
|
|
31
|
+
...(route.options ?? {}),
|
|
17
32
|
}));
|
|
18
|
-
await options.datasource.init(
|
|
33
|
+
await options.datasource.init(datasourceRoutes);
|
|
34
|
+
let realtime;
|
|
19
35
|
if (options.watcher && options.websocketGateway) {
|
|
20
|
-
|
|
36
|
+
const config = (await options.config);
|
|
37
|
+
const watcherRoutes = routes.flatMap(route => {
|
|
38
|
+
if (!route.options)
|
|
39
|
+
return [];
|
|
40
|
+
const schema = parseRouteSchema(route.path);
|
|
41
|
+
if (!schema)
|
|
42
|
+
return [];
|
|
43
|
+
return [{ path: route.path, method: route.method, schema, options: route.options }];
|
|
44
|
+
});
|
|
45
|
+
realtime = options.watcher.watch(config, watcherRoutes, options.datasource).subscribe({
|
|
21
46
|
next: value => options.websocketGateway?.next(value),
|
|
22
47
|
});
|
|
23
48
|
}
|
|
24
|
-
|
|
49
|
+
const useDatasource = (routeOptions, mapper) => {
|
|
25
50
|
return async (c) => {
|
|
26
51
|
const livequeryRequest = getLivequeryRequest(c);
|
|
27
|
-
|
|
28
|
-
|
|
52
|
+
try {
|
|
53
|
+
const result = await options.datasource.query(livequeryRequest, routeOptions);
|
|
54
|
+
return livequeryJson(c, mapDatasourceResult(c, result, mapper));
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
const status = typeof e?.status === 'number' ? e.status : 500;
|
|
58
|
+
return c.json({ error: { code: e?.code ?? 'INTERNAL', message: e?.message ?? 'Internal error' } }, status);
|
|
59
|
+
}
|
|
29
60
|
};
|
|
30
61
|
};
|
|
62
|
+
return Object.assign(useDatasource, { realtime });
|
|
31
63
|
}
|
|
32
64
|
function mapDatasourceResult(c, result, mapper) {
|
|
33
65
|
if (mapper instanceof LivequeryItemMapper) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datasource.js","sourceRoot":"","sources":["../../src/datasource.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAsC,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"datasource.js","sourceRoot":"","sources":["../../src/datasource.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAsC,MAAM,iBAAiB,CAAA;AAE/G,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAK7C,MAAM,OAAO,mBAAmB;IACA;IAA5B,YAA4B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;CACzD;AAoCD,SAAS,gBAAgB,CAAC,IAAY;IAClC,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5D,OAAO,sBAAsB,CAAC,KAAK,CAAC;YAChC,GAAG,EAAE,UAAU;YACf,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,GAAG,EAAE;SACrB,CAAC,EAAE,MAAM,CAAA;IACd,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAA;IACpB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,OAAsD;IAEtD,MAAM,MAAM,GACR,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAA;IAC1E,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;KAC3B,CAAC,CAAuD,CAAA;IAEzD,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAE/C,IAAI,QAAkC,CAAA;IACtC,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAW,CAAA;QAC/C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAsC,KAAK,CAAC,EAAE;YAC9E,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAA;YAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,CAAC,MAAM;gBAAE,OAAO,EAAE,CAAA;YACtB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACvF,CAAC,CAAC,CAAA;QACF,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC;YAClF,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC;SACvD,CAAC,CAAA;IACN,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,YAA0B,EAAE,MAAyB,EAAW,EAAE;QACrF,OAAO,KAAK,EAAC,CAAC,EAAC,EAAE;YACb,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAA;YAC/C,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,gBAAuB,EAAE,YAAY,CAAC,CAAA;gBACpF,OAAO,aAAa,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;YACnE,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAId,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAA;gBAC7D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,IAAI,gBAAgB,EAAE,EAAE,EAAE,MAAa,CAAC,CAAA;YACrH,CAAC;QACL,CAAC,CAAA;IACL,CAAC,CAAA;IAGD,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;AACrD,CAAC;AAMD,SAAS,mBAAmB,CACxB,CAAU,EACV,MAAqC,EACrC,MAAyB;IAEzB,IAAI,MAAM,YAAY,mBAAmB,EAAE,CAAC;QACxC,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA;QACvE,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;QAC5F,OAAO,MAAM,CAAA;IACjB,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAChC,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;QACvF,CAAC;QACD,OAAO,MAAM,CAAA;IACjB,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;IAClF,CAAC;IAED,OAAO,MAAM,CAAA;AACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "git@github.com:livequery/honojs.git"
|
|
7
7
|
},
|
|
8
|
-
"version": "2.0.
|
|
8
|
+
"version": "2.0.149",
|
|
9
9
|
"description": "Hono adapter for @livequery ecosystem",
|
|
10
10
|
"main": "./build/src/index.js",
|
|
11
11
|
"types": "./build/src/index.d.ts",
|
|
@@ -35,8 +35,7 @@
|
|
|
35
35
|
"ws": ">=8"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@livequery/core": "^2.0.
|
|
39
|
-
"@livequery/types": "2.0.7",
|
|
38
|
+
"@livequery/core": "^2.0.149",
|
|
40
39
|
"rxjs": "x"
|
|
41
40
|
}
|
|
42
41
|
}
|