@push-rpc/next 2.0.24 → 2.0.26
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/dist/client/HttpClient.js +3 -1
- package/dist/client/HttpClient.js.map +1 -1
- package/dist/client/RpcClientImpl.d.ts +2 -2
- package/dist/client/RpcClientImpl.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +2 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/remote.d.ts +8 -6
- package/dist/client/remote.js.map +1 -1
- package/dist/index.d.ts +10 -3
- package/dist/index.js.map +1 -1
- package/dist/server/RpcServerImpl.d.ts +3 -3
- package/dist/server/RpcServerImpl.js +48 -10
- package/dist/server/RpcServerImpl.js.map +1 -1
- package/dist/server/{LocalSubscriptions.d.ts → ServerSubscriptions.d.ts} +11 -5
- package/dist/server/{LocalSubscriptions.js → ServerSubscriptions.js} +24 -7
- package/dist/server/ServerSubscriptions.js.map +1 -0
- package/dist/server/http.js +3 -3
- package/dist/server/http.js.map +1 -1
- package/dist/server/implementation.d.ts +32 -0
- package/dist/server/{local.js → implementation.js} +21 -7
- package/dist/server/implementation.js.map +1 -0
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
- package/src/client/HttpClient.ts +5 -1
- package/src/client/RpcClientImpl.ts +2 -2
- package/src/client/index.ts +4 -6
- package/src/client/remote.ts +10 -13
- package/src/index.ts +20 -3
- package/src/server/RpcServerImpl.ts +76 -13
- package/src/server/{LocalSubscriptions.ts → ServerSubscriptions.ts} +40 -10
- package/src/server/http.ts +3 -3
- package/src/server/implementation.ts +116 -0
- package/src/server/index.ts +12 -9
- package/tests/calls.ts +21 -0
- package/tests/events.ts +82 -0
- package/tests/testUtils.ts +4 -4
- package/dist/server/LocalSubscriptions.js.map +0 -1
- package/dist/server/local.d.ts +0 -15
- package/dist/server/local.js.map +0 -1
- package/src/server/local.ts +0 -80
package/tests/calls.ts
CHANGED
|
@@ -50,6 +50,27 @@ describe("calls", () => {
|
|
|
50
50
|
}
|
|
51
51
|
})
|
|
52
52
|
|
|
53
|
+
it("error with non ascii message", async () => {
|
|
54
|
+
const message = "юяї"
|
|
55
|
+
|
|
56
|
+
const services = await startTestServer({
|
|
57
|
+
test: {
|
|
58
|
+
async getSomething() {
|
|
59
|
+
throw new Error(message)
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
const client = await createTestClient<typeof services>()
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
await client.test.getSomething()
|
|
68
|
+
assert.fail()
|
|
69
|
+
} catch (e: any) {
|
|
70
|
+
assert.equal(e.message, message)
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
|
|
53
74
|
it("error with extra fields and status", async () => {
|
|
54
75
|
const services = await startTestServer({
|
|
55
76
|
test: {
|
package/tests/events.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import {createTestClient, startTestServer, testClient} from "./testUtils.js"
|
|
2
|
+
import {assert} from "chai"
|
|
3
|
+
import {adelay} from "../src/utils/promises.js"
|
|
4
|
+
|
|
5
|
+
describe("Events", () => {
|
|
6
|
+
it("subscribe event", async () => {
|
|
7
|
+
const services = await startTestServer({
|
|
8
|
+
test: {
|
|
9
|
+
item: async (a: string) => {},
|
|
10
|
+
},
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
let event
|
|
14
|
+
services.test.item.addEventListener("subscribe", (e) => {
|
|
15
|
+
event = e
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
const client = await createTestClient<typeof services>()
|
|
19
|
+
|
|
20
|
+
await client.test.item.subscribe(() => {}, "a")
|
|
21
|
+
|
|
22
|
+
assert.deepEqual(event, {
|
|
23
|
+
itemName: "test/item",
|
|
24
|
+
filter: "a",
|
|
25
|
+
clientId: testClient!.clientId,
|
|
26
|
+
context: {
|
|
27
|
+
clientId: testClient!.clientId,
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
it("unsubscribe event", async () => {
|
|
32
|
+
const services = await startTestServer({
|
|
33
|
+
test: {
|
|
34
|
+
item: async (a: string) => {},
|
|
35
|
+
},
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
let event
|
|
39
|
+
services.test.item.addEventListener("unsubscribe", (e) => {
|
|
40
|
+
event = e
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
const client = await createTestClient<typeof services>()
|
|
44
|
+
|
|
45
|
+
const listener = () => {}
|
|
46
|
+
await client.test.item.subscribe(listener, "a")
|
|
47
|
+
await client.test.item.unsubscribe(listener, "a")
|
|
48
|
+
|
|
49
|
+
assert.deepEqual(event, {
|
|
50
|
+
itemName: "test/item",
|
|
51
|
+
filter: "a",
|
|
52
|
+
clientId: testClient!.clientId,
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
it("unsubscribe on disconnect WS", async () => {
|
|
56
|
+
const services = await startTestServer({
|
|
57
|
+
test: {
|
|
58
|
+
item: async (a: string) => {},
|
|
59
|
+
},
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
let event
|
|
63
|
+
services.test.item.addEventListener("unsubscribe", (e) => {
|
|
64
|
+
event = e
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
const client = await createTestClient<typeof services>()
|
|
68
|
+
|
|
69
|
+
const listener = () => {}
|
|
70
|
+
await client.test.item.subscribe(listener, "a")
|
|
71
|
+
|
|
72
|
+
await testClient!.close()
|
|
73
|
+
|
|
74
|
+
await adelay(100)
|
|
75
|
+
|
|
76
|
+
assert.deepEqual(event, {
|
|
77
|
+
itemName: "test/item",
|
|
78
|
+
filter: "a",
|
|
79
|
+
clientId: testClient!.clientId,
|
|
80
|
+
})
|
|
81
|
+
})
|
|
82
|
+
})
|
package/tests/testUtils.ts
CHANGED
|
@@ -7,8 +7,8 @@ import {
|
|
|
7
7
|
RpcContext,
|
|
8
8
|
RpcServer,
|
|
9
9
|
Services,
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
ServicesClient,
|
|
11
|
+
ServicesImplementation,
|
|
12
12
|
} from "../src/index.js"
|
|
13
13
|
import WebSocket from "ws"
|
|
14
14
|
|
|
@@ -21,7 +21,7 @@ export let testServer: RpcServer | null = null
|
|
|
21
21
|
export async function startTestServer<S extends Services<S>, C extends RpcContext>(
|
|
22
22
|
local: S,
|
|
23
23
|
options: Partial<PublishServicesOptions<C>> = {},
|
|
24
|
-
): Promise<
|
|
24
|
+
): Promise<ServicesImplementation<S>> {
|
|
25
25
|
const r = await publishServices<S, C>(local, {
|
|
26
26
|
port: TEST_PORT,
|
|
27
27
|
path: "/rpc",
|
|
@@ -35,7 +35,7 @@ export let testClient: RpcClient | null = null
|
|
|
35
35
|
|
|
36
36
|
export async function createTestClient<S extends Services<S>>(
|
|
37
37
|
options?: Partial<ConsumeServicesOptions>,
|
|
38
|
-
): Promise<
|
|
38
|
+
): Promise<ServicesClient<S>> {
|
|
39
39
|
if (!options) options = {}
|
|
40
40
|
if (!options.middleware) options.middleware = []
|
|
41
41
|
options.middleware = [logMiddleware, ...options.middleware]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LocalSubscriptions.js","sourceRoot":"","sources":["../../src/server/LocalSubscriptions.ts"],"names":[],"mappings":"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"}
|
package/dist/server/local.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { RemoteFunction, Services } from "../rpc.js";
|
|
2
|
-
import { LocalSubscriptions } from "./LocalSubscriptions.js";
|
|
3
|
-
import { ExtractPromiseResult } from "../utils/types.js";
|
|
4
|
-
import { ThrottleArgsReducer } from "../utils/throttle.js";
|
|
5
|
-
export type ThrottleSettings<D> = {
|
|
6
|
-
timeout: number;
|
|
7
|
-
reducer?: ThrottleArgsReducer<D>;
|
|
8
|
-
};
|
|
9
|
-
export declare function withTriggers<T extends Services<T>>(localSubscriptions: LocalSubscriptions, services: T, name?: string): ServicesWithTriggers<T>;
|
|
10
|
-
export type ServicesWithTriggers<T extends Services<T>> = {
|
|
11
|
-
[K in keyof T]: T[K] extends RemoteFunction ? T[K] & {
|
|
12
|
-
trigger(filter?: Partial<Parameters<T[K]>[0]>, suppliedData?: ExtractPromiseResult<ReturnType<T[K]>>): void;
|
|
13
|
-
throttle(settings: ThrottleSettings<ExtractPromiseResult<ReturnType<T[K]>>>): void;
|
|
14
|
-
} : T[K] extends object ? ServicesWithTriggers<T[K]> : never;
|
|
15
|
-
};
|
package/dist/server/local.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/server/local.ts"],"names":[],"mappings":";;;AAUA,SAAgB,YAAY,CAC1B,kBAAsC,EACtC,QAAW,EACX,IAAI,GAAG,EAAE;IAET,MAAM,WAAW,GAAQ,EAAE,CAAA;IAC3B,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;IAE3E,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;QACzB,GAAG,CAAC,MAAW,EAAE,QAAgB;YAC/B,sBAAsB;YACtB,IAAI,OAAO,QAAQ,IAAI,QAAQ;gBAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAA;YAExD,0BAA0B;YAC1B,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAA;YAE5F,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;YAExD,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAiB,EAAE,EAAE;oBACxC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAA;gBACpC,CAAC,CAAA;gBAED,QAAQ,CAAC,OAAO,GAAG,CAAC,SAAkC,EAAE,EAAE,YAAsB,EAAE,EAAE;oBAClF,qFAAqF;oBACrF,UAAU,CAAC,GAAG,EAAE;wBACd,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;oBAC5D,CAAC,EAAE,CAAC,CAAC,CAAA;gBACP,CAAC,CAAA;gBAED,QAAQ,CAAC,QAAQ,GAAG,CAAC,QAAmC,EAAE,EAAE;oBAC1D,kBAAkB,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;gBACrD,CAAC,CAAA;gBAED,OAAO,QAAQ,CAAA;YACjB,CAAC;iBAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,WAAW,CAAC,QAAQ,CAAC,GAAG,YAAY,CAClC,kBAAkB,EAClB,QAAQ,CAAC,QAAmB,CAAQ,EACpC,QAAQ,CACT,CAAA;YACH,CAAC;YAED,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAA;QAC9B,CAAC;QAED,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK;YACzB,WAAW,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAA;YAC7B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO;YACL,OAAO,CAAC,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;QACvD,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAvDD,oCAuDC"}
|
package/src/server/local.ts
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import {RemoteFunction, Services} from "../rpc.js"
|
|
2
|
-
import {LocalSubscriptions} from "./LocalSubscriptions.js"
|
|
3
|
-
import {ExtractPromiseResult} from "../utils/types.js"
|
|
4
|
-
import {ThrottleArgsReducer} from "../utils/throttle.js"
|
|
5
|
-
|
|
6
|
-
export type ThrottleSettings<D> = {
|
|
7
|
-
timeout: number
|
|
8
|
-
reducer?: ThrottleArgsReducer<D>
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function withTriggers<T extends Services<T>>(
|
|
12
|
-
localSubscriptions: LocalSubscriptions,
|
|
13
|
-
services: T,
|
|
14
|
-
name = ""
|
|
15
|
-
): ServicesWithTriggers<T> {
|
|
16
|
-
const cachedItems: any = {}
|
|
17
|
-
const skippedProps = ["length", "name", "prototype", "arguments", "caller"]
|
|
18
|
-
|
|
19
|
-
return new Proxy(services, {
|
|
20
|
-
get(target: any, propName: string) {
|
|
21
|
-
// skip internal props
|
|
22
|
-
if (typeof propName != "string") return target[propName]
|
|
23
|
-
|
|
24
|
-
// skip other system props
|
|
25
|
-
if (["then", "catch", "toJSON", ...skippedProps].includes(propName)) return target[propName]
|
|
26
|
-
|
|
27
|
-
const itemName = name ? name + "/" + propName : propName
|
|
28
|
-
|
|
29
|
-
if (typeof target[propName] == "function") {
|
|
30
|
-
const delegate = (...params: unknown[]) => {
|
|
31
|
-
return target[propName](...params)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
delegate.trigger = (filter: Record<string, unknown> = {}, suppliedData?: unknown) => {
|
|
35
|
-
// triggers are delayed for consumers to receive updates after the current call ends.
|
|
36
|
-
setTimeout(() => {
|
|
37
|
-
localSubscriptions.trigger(itemName, filter, suppliedData)
|
|
38
|
-
}, 0)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
delegate.throttle = (settings: ThrottleSettings<unknown>) => {
|
|
42
|
-
localSubscriptions.throttleItem(itemName, settings)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return delegate
|
|
46
|
-
} else if (!cachedItems[propName]) {
|
|
47
|
-
cachedItems[propName] = withTriggers(
|
|
48
|
-
localSubscriptions,
|
|
49
|
-
services[propName as keyof T] as any,
|
|
50
|
-
itemName
|
|
51
|
-
)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return cachedItems[propName]
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
set(target, propName, value) {
|
|
58
|
-
cachedItems[propName] = value
|
|
59
|
-
return true
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
ownKeys() {
|
|
63
|
-
return [...skippedProps, ...Object.keys(cachedItems)]
|
|
64
|
-
},
|
|
65
|
-
})
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export type ServicesWithTriggers<T extends Services<T>> = {
|
|
69
|
-
[K in keyof T]: T[K] extends RemoteFunction
|
|
70
|
-
? T[K] & {
|
|
71
|
-
trigger(
|
|
72
|
-
filter?: Partial<Parameters<T[K]>[0]>,
|
|
73
|
-
suppliedData?: ExtractPromiseResult<ReturnType<T[K]>>
|
|
74
|
-
): void
|
|
75
|
-
throttle(settings: ThrottleSettings<ExtractPromiseResult<ReturnType<T[K]>>>): void
|
|
76
|
-
}
|
|
77
|
-
: T[K] extends object
|
|
78
|
-
? ServicesWithTriggers<T[K]>
|
|
79
|
-
: never
|
|
80
|
-
}
|