@cloudpss/message-stream 0.6.29 → 0.6.31
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/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/plugin.d.ts +6 -18
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +24 -3
- package/dist/plugin.js.map +1 -1
- package/package.json +7 -7
- package/src/index.ts +6 -4
- package/src/plugin.ts +23 -16
- package/tests/e2e.ts +12 -7
package/dist/index.d.ts
CHANGED
|
@@ -28,13 +28,13 @@ export type StreamWriteHandler = Tagged<string, 'StreamWriteHandler'>;
|
|
|
28
28
|
/**
|
|
29
29
|
* 消息流,需要使用 {@link StreamToken} 查询
|
|
30
30
|
*/
|
|
31
|
-
export interface Stream {
|
|
31
|
+
export interface Stream<T extends StreamType = StreamType> {
|
|
32
32
|
/** id */
|
|
33
33
|
readonly id: StreamId;
|
|
34
34
|
/** token */
|
|
35
35
|
readonly token: StreamToken;
|
|
36
36
|
/** 存储流中消息的类型 */
|
|
37
|
-
readonly type:
|
|
37
|
+
readonly type: T;
|
|
38
38
|
/** 可选的注释 */
|
|
39
39
|
readonly comment: string;
|
|
40
40
|
/** 流的状态 */
|
|
@@ -51,9 +51,9 @@ export interface Stream {
|
|
|
51
51
|
readonly durability: number;
|
|
52
52
|
}
|
|
53
53
|
/** 消息流信息,使用 {@link StreamId} 查询 */
|
|
54
|
-
export type StreamInfo = Omit<Stream
|
|
54
|
+
export type StreamInfo<T extends StreamType = StreamType> = Omit<Stream<T>, 'token' | 'handler'>;
|
|
55
55
|
/** 创建流需要的数据 */
|
|
56
|
-
export type StreamArgs = Simplify<Pick<Stream
|
|
56
|
+
export type StreamArgs<T extends StreamType = StreamType> = Simplify<Pick<Stream<T>, 'type'> & Partial<Pick<Stream<T>, 'comment' | 'durability'>>>;
|
|
57
57
|
/** 消息 ID */
|
|
58
58
|
export type MessageId = Tagged<UUID, 'MessageId'>;
|
|
59
59
|
/** 原始消息 */
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAChD,+CAA+C;AAC/C,eAAO,MAAM,eAAe,EAAe,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACtD,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,EAAe,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC9E,eAAO,MAAM,UAAU,+BAA+C,CAAC;AACvE;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AACrD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC3D,iDAAiD;AACjD,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,MAAM;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -7,17 +7,9 @@ declare class MessageStreamClient {
|
|
|
7
7
|
readonly client: HttpClient;
|
|
8
8
|
constructor(client: HttpClient);
|
|
9
9
|
/** 创建流 */
|
|
10
|
-
create<T extends StreamType>(args: StreamArgs
|
|
11
|
-
readonly type: T;
|
|
12
|
-
}): Promise<Stream & {
|
|
13
|
-
readonly type: T;
|
|
14
|
-
}>;
|
|
10
|
+
create<T extends StreamType>(args: StreamArgs<T>): Promise<Stream<T>>;
|
|
15
11
|
/** 批量创建流 */
|
|
16
|
-
create<T extends StreamType>(args: ReadonlyArray<StreamArgs
|
|
17
|
-
readonly type: T;
|
|
18
|
-
}>): Promise<Array<Stream & {
|
|
19
|
-
readonly type: T;
|
|
20
|
-
}>>;
|
|
12
|
+
create<T extends StreamType>(args: ReadonlyArray<StreamArgs<T>>): Promise<Array<Stream<T>>>;
|
|
21
13
|
/** 冻结流 */
|
|
22
14
|
freeze(token: StreamToken): Promise<boolean>;
|
|
23
15
|
/** 删除流 */
|
|
@@ -27,17 +19,13 @@ declare class MessageStreamClient {
|
|
|
27
19
|
/** 获取流信息 */
|
|
28
20
|
get(token: StreamToken): Promise<Stream>;
|
|
29
21
|
/** 读取消息 */
|
|
30
|
-
read<T extends StreamType>(stream: {
|
|
31
|
-
readonly id: StreamId;
|
|
32
|
-
readonly type: T;
|
|
33
|
-
}, options?: {
|
|
22
|
+
read<T extends StreamType>(stream: Pick<Stream<T>, 'id' | 'type'>, options?: {
|
|
34
23
|
from?: Date;
|
|
24
|
+
skip?: number;
|
|
25
|
+
take?: number;
|
|
35
26
|
}): Observable<Message<T>>;
|
|
36
27
|
/** 写入消息 */
|
|
37
|
-
write<T extends StreamType>(stream:
|
|
38
|
-
readonly token: StreamToken;
|
|
39
|
-
readonly type: T;
|
|
40
|
-
}, data: ObservableInput<Message<T>['data']>): Promise<void>;
|
|
28
|
+
write<T extends StreamType>(stream: Pick<Stream<T>, 'token' | 'type'>, data: ObservableInput<Message<T>['data']>): Promise<void>;
|
|
41
29
|
}
|
|
42
30
|
/**
|
|
43
31
|
* 添加消息流插件,使得可以通过 `client.stream` 访问消息流相关接口
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,UAAU,EAAE,KAAK,eAAe,EAAuB,MAAM,MAAM,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG1E,OAAO,KAAK,EACR,OAAO,EACP,UAAU,EACV,MAAM,EACN,UAAU,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,UAAU,EACb,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AAuBvG,aAAa;AACb,cAAM,mBAAmB;IACT,QAAQ,CAAC,MAAM,EAAE,UAAU;gBAAlB,MAAM,EAAE,UAAU;IAEvC,UAAU;IACJ,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3E,YAAY;IACN,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAajG,UAAU;IACJ,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAOlD,UAAU;IACJ,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,YAAY;IACN,IAAI,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAK7C,YAAY;IACN,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAK9C,WAAW;IACX,IAAI,CAAC,CAAC,SAAS,UAAU,EACrB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,EACtC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GACxD,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IA0CzB,WAAW;IACL,KAAK,CAAC,CAAC,SAAS,UAAU,EAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,EACzC,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC;CAoEnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAMhG"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Observable, from } from 'rxjs';
|
|
1
|
+
import { EMPTY, Observable, from, lastValueFrom } from 'rxjs';
|
|
2
2
|
import { connected, disconnected } from '@cloudpss/fetch';
|
|
3
3
|
import { decode, decodeMany, encodeMany } from '@cloudpss/ubjson';
|
|
4
|
+
import { EMPTY_STREAM_ID, EMPTY_STREAM_TOKEN } from './index.js';
|
|
4
5
|
/** 解析响应 */
|
|
5
6
|
function parseStreamInfo(data) {
|
|
6
7
|
data.createdAt = new Date(data.createdAt);
|
|
@@ -40,6 +41,8 @@ class MessageStreamClient {
|
|
|
40
41
|
}
|
|
41
42
|
/** 冻结流 */
|
|
42
43
|
async freeze(token) {
|
|
44
|
+
if (token === EMPTY_STREAM_TOKEN)
|
|
45
|
+
return false;
|
|
43
46
|
const result = await this.client.restful(`/streams/token/${token}/freeze`, undefined, { method: 'PUT' });
|
|
44
47
|
if (result.response.status === 204)
|
|
45
48
|
return false;
|
|
@@ -47,6 +50,8 @@ class MessageStreamClient {
|
|
|
47
50
|
}
|
|
48
51
|
/** 删除流 */
|
|
49
52
|
async delete(token) {
|
|
53
|
+
if (token === EMPTY_STREAM_TOKEN)
|
|
54
|
+
return;
|
|
50
55
|
await this.client.restful(`/streams/token/${token}`, undefined, { method: 'DELETE' });
|
|
51
56
|
}
|
|
52
57
|
/** 获取流信息 */
|
|
@@ -62,9 +67,21 @@ class MessageStreamClient {
|
|
|
62
67
|
/** 读取消息 */
|
|
63
68
|
read(stream, options) {
|
|
64
69
|
const { id, type } = stream;
|
|
65
|
-
|
|
70
|
+
if (id === EMPTY_STREAM_ID)
|
|
71
|
+
return EMPTY;
|
|
72
|
+
let paramStr = '';
|
|
73
|
+
if (options != null) {
|
|
74
|
+
const params = new URLSearchParams();
|
|
75
|
+
if (options.from)
|
|
76
|
+
params.set('from', options.from.toISOString());
|
|
77
|
+
if (options.skip)
|
|
78
|
+
params.set('skip', String(options.skip));
|
|
79
|
+
if (options.take)
|
|
80
|
+
params.set('take', String(options.take));
|
|
81
|
+
paramStr = `?` + params.toString();
|
|
82
|
+
}
|
|
66
83
|
return new Observable((subscriber) => {
|
|
67
|
-
const ws = this.client.ws(`/streams/id/${id}${
|
|
84
|
+
const ws = this.client.ws(`/streams/id/${id}${paramStr}`);
|
|
68
85
|
ws.binaryType = 'arraybuffer';
|
|
69
86
|
ws.addEventListener('message', (event) => {
|
|
70
87
|
if (typeof event.data === 'string' || !event.data)
|
|
@@ -100,6 +117,10 @@ class MessageStreamClient {
|
|
|
100
117
|
/** 写入消息 */
|
|
101
118
|
async write(stream, data) {
|
|
102
119
|
const { token, type } = stream;
|
|
120
|
+
if (token === EMPTY_STREAM_TOKEN) {
|
|
121
|
+
await lastValueFrom(from(data), { defaultValue: undefined });
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
103
124
|
return new Promise((resolve, reject) => {
|
|
104
125
|
const ws = this.client.ws(`/streams/token/${token}`);
|
|
105
126
|
let queue = connected(ws).catch((error) => {
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAwB,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudpss/message-stream",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.31",
|
|
4
4
|
"author": "CloudPSS",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"rxjs": "^7.8.2",
|
|
16
|
-
"type-fest": "^5.
|
|
17
|
-
"@cloudpss/fetch": "~0.6.
|
|
18
|
-
"@cloudpss/id": "~0.6.
|
|
19
|
-
"@cloudpss/ubjson": "~0.6.
|
|
16
|
+
"type-fest": "^5.6.0",
|
|
17
|
+
"@cloudpss/fetch": "~0.6.31",
|
|
18
|
+
"@cloudpss/id": "~0.6.31",
|
|
19
|
+
"@cloudpss/ubjson": "~0.6.31"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@cloudpss/http-client": "~0.6.
|
|
22
|
+
"@cloudpss/http-client": "~0.6.31"
|
|
23
23
|
},
|
|
24
24
|
"peerDependenciesMeta": {
|
|
25
25
|
"@cloudpss/http-client": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@cloudpss/http-client": "~0.6.
|
|
30
|
+
"@cloudpss/http-client": "~0.6.31"
|
|
31
31
|
},
|
|
32
32
|
"scripts": {
|
|
33
33
|
"build": "pnpm clean && tsc --build --force",
|
package/src/index.ts
CHANGED
|
@@ -31,14 +31,14 @@ export type StreamWriteHandler = Tagged<string, 'StreamWriteHandler'>;
|
|
|
31
31
|
/**
|
|
32
32
|
* 消息流,需要使用 {@link StreamToken} 查询
|
|
33
33
|
*/
|
|
34
|
-
export interface Stream {
|
|
34
|
+
export interface Stream<T extends StreamType = StreamType> {
|
|
35
35
|
/** id */
|
|
36
36
|
readonly id: StreamId;
|
|
37
37
|
/** token */
|
|
38
38
|
readonly token: StreamToken;
|
|
39
39
|
|
|
40
40
|
/** 存储流中消息的类型 */
|
|
41
|
-
readonly type:
|
|
41
|
+
readonly type: T;
|
|
42
42
|
/** 可选的注释 */
|
|
43
43
|
readonly comment: string;
|
|
44
44
|
/** 流的状态 */
|
|
@@ -57,9 +57,11 @@ export interface Stream {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
/** 消息流信息,使用 {@link StreamId} 查询 */
|
|
60
|
-
export type StreamInfo = Omit<Stream
|
|
60
|
+
export type StreamInfo<T extends StreamType = StreamType> = Omit<Stream<T>, 'token' | 'handler'>;
|
|
61
61
|
/** 创建流需要的数据 */
|
|
62
|
-
export type StreamArgs =
|
|
62
|
+
export type StreamArgs<T extends StreamType = StreamType> = Simplify<
|
|
63
|
+
Pick<Stream<T>, 'type'> & Partial<Pick<Stream<T>, 'comment' | 'durability'>>
|
|
64
|
+
>;
|
|
63
65
|
|
|
64
66
|
/** 消息 ID */
|
|
65
67
|
export type MessageId = Tagged<UUID, 'MessageId'>;
|
package/src/plugin.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Writable } from 'type-fest';
|
|
2
|
-
import { Observable, type ObservableInput, from } from 'rxjs';
|
|
2
|
+
import { EMPTY, Observable, type ObservableInput, from, lastValueFrom } from 'rxjs';
|
|
3
3
|
import type { HttpClient, HttpClientPlugin } from '@cloudpss/http-client';
|
|
4
4
|
import { connected, disconnected } from '@cloudpss/fetch';
|
|
5
5
|
import { decode, decodeMany, encodeMany } from '@cloudpss/ubjson';
|
|
@@ -13,6 +13,7 @@ import type {
|
|
|
13
13
|
StreamToken,
|
|
14
14
|
StreamType,
|
|
15
15
|
} from './index.js';
|
|
16
|
+
import { EMPTY_STREAM_ID, EMPTY_STREAM_TOKEN } from './index.js';
|
|
16
17
|
|
|
17
18
|
export type { Message, RawMessage, Stream, StreamArgs, StreamId, StreamInfo, StreamToken, StreamType };
|
|
18
19
|
|
|
@@ -42,11 +43,9 @@ class MessageStreamClient {
|
|
|
42
43
|
constructor(readonly client: HttpClient) {}
|
|
43
44
|
|
|
44
45
|
/** 创建流 */
|
|
45
|
-
async create<T extends StreamType>(args: StreamArgs
|
|
46
|
+
async create<T extends StreamType>(args: StreamArgs<T>): Promise<Stream<T>>;
|
|
46
47
|
/** 批量创建流 */
|
|
47
|
-
async create<T extends StreamType>(
|
|
48
|
-
args: ReadonlyArray<StreamArgs & { readonly type: T }>,
|
|
49
|
-
): Promise<Array<Stream & { readonly type: T }>>;
|
|
48
|
+
async create<T extends StreamType>(args: ReadonlyArray<StreamArgs<T>>): Promise<Array<Stream<T>>>;
|
|
50
49
|
/** 创建流 */
|
|
51
50
|
async create(args: StreamArgs | readonly StreamArgs[]): Promise<Stream | Stream[]> {
|
|
52
51
|
if (Array.isArray(args)) {
|
|
@@ -61,6 +60,7 @@ class MessageStreamClient {
|
|
|
61
60
|
|
|
62
61
|
/** 冻结流 */
|
|
63
62
|
async freeze(token: StreamToken): Promise<boolean> {
|
|
63
|
+
if (token === EMPTY_STREAM_TOKEN) return false;
|
|
64
64
|
const result = await this.client.restful(`/streams/token/${token}/freeze`, undefined, { method: 'PUT' });
|
|
65
65
|
if (result.response.status === 204) return false;
|
|
66
66
|
return true;
|
|
@@ -68,6 +68,7 @@ class MessageStreamClient {
|
|
|
68
68
|
|
|
69
69
|
/** 删除流 */
|
|
70
70
|
async delete(token: StreamToken): Promise<void> {
|
|
71
|
+
if (token === EMPTY_STREAM_TOKEN) return;
|
|
71
72
|
await this.client.restful(`/streams/token/${token}`, undefined, { method: 'DELETE' });
|
|
72
73
|
}
|
|
73
74
|
|
|
@@ -85,16 +86,21 @@ class MessageStreamClient {
|
|
|
85
86
|
|
|
86
87
|
/** 读取消息 */
|
|
87
88
|
read<T extends StreamType>(
|
|
88
|
-
stream:
|
|
89
|
-
|
|
90
|
-
readonly type: T;
|
|
91
|
-
},
|
|
92
|
-
options?: { from?: Date },
|
|
89
|
+
stream: Pick<Stream<T>, 'id' | 'type'>,
|
|
90
|
+
options?: { from?: Date; skip?: number; take?: number },
|
|
93
91
|
): Observable<Message<T>> {
|
|
94
92
|
const { id, type } = stream;
|
|
95
|
-
|
|
93
|
+
if (id === EMPTY_STREAM_ID) return EMPTY;
|
|
94
|
+
let paramStr = '';
|
|
95
|
+
if (options != null) {
|
|
96
|
+
const params = new URLSearchParams();
|
|
97
|
+
if (options.from) params.set('from', options.from.toISOString());
|
|
98
|
+
if (options.skip) params.set('skip', String(options.skip));
|
|
99
|
+
if (options.take) params.set('take', String(options.take));
|
|
100
|
+
paramStr = `?` + params.toString();
|
|
101
|
+
}
|
|
96
102
|
return new Observable<Message<T>>((subscriber) => {
|
|
97
|
-
const ws = this.client.ws(`/streams/id/${id}${
|
|
103
|
+
const ws = this.client.ws(`/streams/id/${id}${paramStr}`);
|
|
98
104
|
ws.binaryType = 'arraybuffer';
|
|
99
105
|
ws.addEventListener('message', (event) => {
|
|
100
106
|
if (typeof event.data === 'string' || !event.data) return;
|
|
@@ -126,13 +132,14 @@ class MessageStreamClient {
|
|
|
126
132
|
|
|
127
133
|
/** 写入消息 */
|
|
128
134
|
async write<T extends StreamType>(
|
|
129
|
-
stream:
|
|
130
|
-
readonly token: StreamToken;
|
|
131
|
-
readonly type: T;
|
|
132
|
-
},
|
|
135
|
+
stream: Pick<Stream<T>, 'token' | 'type'>,
|
|
133
136
|
data: ObservableInput<Message<T>['data']>,
|
|
134
137
|
): Promise<void> {
|
|
135
138
|
const { token, type } = stream;
|
|
139
|
+
if (token === EMPTY_STREAM_TOKEN) {
|
|
140
|
+
await lastValueFrom(from(data), { defaultValue: undefined });
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
136
143
|
return new Promise((resolve, reject) => {
|
|
137
144
|
const ws = this.client.ws(`/streams/token/${token}`);
|
|
138
145
|
let queue = connected(ws).catch((error) => {
|
package/tests/e2e.ts
CHANGED
|
@@ -13,9 +13,9 @@ const source = new Subject();
|
|
|
13
13
|
|
|
14
14
|
const w = http.stream.write(stream, source);
|
|
15
15
|
for (const i of Array.from({ length: 5 }).keys()) source.next(new Uint8Array([i]));
|
|
16
|
-
source.next(10);
|
|
16
|
+
// source.next(10);
|
|
17
17
|
for (const i of Array.from({ length: 5 }).keys()) source.next(new Uint8Array([i + 5]));
|
|
18
|
-
source.error('xxs');
|
|
18
|
+
// source.error('xxs');
|
|
19
19
|
source.complete();
|
|
20
20
|
try {
|
|
21
21
|
await w;
|
|
@@ -25,8 +25,13 @@ try {
|
|
|
25
25
|
}
|
|
26
26
|
await http.stream.freeze(stream.token);
|
|
27
27
|
console.log(stream);
|
|
28
|
-
http.stream
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
http.stream
|
|
29
|
+
.read(stream, { skip: 5, take: 2 })
|
|
30
|
+
.subscribe((x) => {
|
|
31
|
+
console.log(x.data);
|
|
32
|
+
})
|
|
33
|
+
.add(() => {
|
|
34
|
+
console.log('read complete');
|
|
35
|
+
void http.stream.delete(stream.token);
|
|
36
|
+
});
|
|
37
|
+
// await setTimeout(10);
|