@aws-sdk/middleware-sdk-transcribe-streaming 3.258.0 → 3.266.1

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.
@@ -9,17 +9,32 @@ class WebSocketHandler {
9
9
  this.metadata = {
10
10
  handlerProtocol: "websocket",
11
11
  };
12
+ this.sockets = {};
12
13
  this.connectionTimeout = connectionTimeout || 2000;
13
14
  }
14
- destroy() { }
15
+ destroy() {
16
+ for (const [key, sockets] of Object.entries(this.sockets)) {
17
+ for (const socket of sockets) {
18
+ socket.close(1000, `Socket closed through destroy() call`);
19
+ }
20
+ delete this.sockets[key];
21
+ }
22
+ }
23
+ removeNotUsableSockets(url) {
24
+ this.sockets[url] = this.sockets[url].filter((socket) => ![WebSocket.CLOSING, WebSocket.CLOSED].includes(socket.readyState));
25
+ }
15
26
  async handle(request) {
16
27
  const url = (0, util_format_url_1.formatUrl)(request);
17
28
  const socket = new WebSocket(url);
29
+ if (!this.sockets[url]) {
30
+ this.sockets[url] = [];
31
+ }
32
+ this.sockets[url].push(socket);
18
33
  socket.binaryType = "arraybuffer";
19
- await waitForReady(socket, this.connectionTimeout);
34
+ await this.waitForReady(socket, this.connectionTimeout);
20
35
  const { body } = request;
21
36
  const bodyStream = getIterator(body);
22
- const asyncIterable = connect(socket, bodyStream);
37
+ const asyncIterable = this.connect(socket, bodyStream);
23
38
  const outputPayload = toReadableStream(asyncIterable);
24
39
  return {
25
40
  response: new protocol_http_1.HttpResponse({
@@ -28,82 +43,88 @@ class WebSocketHandler {
28
43
  }),
29
44
  };
30
45
  }
31
- }
32
- exports.WebSocketHandler = WebSocketHandler;
33
- const waitForReady = (socket, connectionTimeout) => new Promise((resolve, reject) => {
34
- const timeout = setTimeout(() => {
35
- reject({
36
- $metadata: {
37
- httpStatusCode: 500,
38
- },
46
+ waitForReady(socket, connectionTimeout) {
47
+ return new Promise((resolve, reject) => {
48
+ const timeout = setTimeout(() => {
49
+ this.removeNotUsableSockets(socket.url);
50
+ reject({
51
+ $metadata: {
52
+ httpStatusCode: 500,
53
+ },
54
+ });
55
+ }, connectionTimeout);
56
+ socket.onopen = () => {
57
+ clearTimeout(timeout);
58
+ resolve();
59
+ };
39
60
  });
40
- }, connectionTimeout);
41
- socket.onopen = () => {
42
- clearTimeout(timeout);
43
- resolve();
44
- };
45
- });
46
- const connect = (socket, data) => {
47
- let streamError = undefined;
48
- const outputStream = {
49
- [Symbol.asyncIterator]: () => ({
50
- next: () => {
51
- return new Promise((resolve, reject) => {
52
- socket.onerror = (error) => {
53
- socket.onclose = null;
54
- socket.close();
55
- reject(error);
56
- };
57
- socket.onclose = () => {
58
- if (streamError) {
59
- reject(streamError);
60
- }
61
- else {
61
+ }
62
+ connect(socket, data) {
63
+ let streamError = undefined;
64
+ const outputStream = {
65
+ [Symbol.asyncIterator]: () => ({
66
+ next: () => {
67
+ return new Promise((resolve, reject) => {
68
+ let socketErrorOccurred = false;
69
+ socket.onerror = (error) => {
70
+ socketErrorOccurred = true;
71
+ socket.close();
72
+ reject(error);
73
+ };
74
+ socket.onclose = () => {
75
+ this.removeNotUsableSockets(socket.url);
76
+ if (socketErrorOccurred)
77
+ return;
78
+ if (streamError) {
79
+ reject(streamError);
80
+ }
81
+ else {
82
+ resolve({
83
+ done: true,
84
+ value: undefined,
85
+ });
86
+ }
87
+ };
88
+ socket.onmessage = (event) => {
62
89
  resolve({
63
- done: true,
64
- value: undefined,
90
+ done: false,
91
+ value: new Uint8Array(event.data),
65
92
  });
66
- }
67
- };
68
- socket.onmessage = (event) => {
69
- resolve({
70
- done: false,
71
- value: new Uint8Array(event.data),
72
- });
73
- };
74
- });
75
- },
76
- }),
77
- };
78
- const send = async () => {
79
- try {
80
- for await (const inputChunk of data) {
81
- socket.send(inputChunk);
93
+ };
94
+ });
95
+ },
96
+ }),
97
+ };
98
+ const send = async () => {
99
+ try {
100
+ for await (const inputChunk of data) {
101
+ socket.send(inputChunk);
102
+ }
82
103
  }
83
- }
84
- catch (err) {
85
- streamError = err;
86
- }
87
- finally {
88
- socket.close(1000);
89
- }
90
- };
91
- send();
92
- return outputStream;
93
- };
104
+ catch (err) {
105
+ streamError = err;
106
+ }
107
+ finally {
108
+ socket.close(1000);
109
+ }
110
+ };
111
+ send();
112
+ return outputStream;
113
+ }
114
+ }
115
+ exports.WebSocketHandler = WebSocketHandler;
94
116
  const getIterator = (stream) => {
95
- if (stream[Symbol.asyncIterator])
117
+ if (stream[Symbol.asyncIterator]) {
96
118
  return stream;
97
- else if (isReadableStream(stream)) {
98
- return (0, eventstream_serde_browser_1.readableStreamtoIterable)(stream);
99
119
  }
100
- else {
101
- return {
102
- [Symbol.asyncIterator]: async function* () {
103
- yield stream;
104
- },
105
- };
120
+ if (isReadableStream(stream)) {
121
+ return (0, eventstream_serde_browser_1.readableStreamtoIterable)(stream);
106
122
  }
123
+ return {
124
+ [Symbol.asyncIterator]: async function* () {
125
+ yield stream;
126
+ },
127
+ };
107
128
  };
108
129
  const toReadableStream = (asyncIterable) => typeof ReadableStream === "function" ? (0, eventstream_serde_browser_1.iterableToReadableStream)(asyncIterable) : asyncIterable;
109
130
  const isReadableStream = (payload) => typeof ReadableStream === "function" && payload instanceof ReadableStream;
@@ -6,17 +6,32 @@ export class WebSocketHandler {
6
6
  this.metadata = {
7
7
  handlerProtocol: "websocket",
8
8
  };
9
+ this.sockets = {};
9
10
  this.connectionTimeout = connectionTimeout || 2000;
10
11
  }
11
- destroy() { }
12
+ destroy() {
13
+ for (const [key, sockets] of Object.entries(this.sockets)) {
14
+ for (const socket of sockets) {
15
+ socket.close(1000, `Socket closed through destroy() call`);
16
+ }
17
+ delete this.sockets[key];
18
+ }
19
+ }
20
+ removeNotUsableSockets(url) {
21
+ this.sockets[url] = this.sockets[url].filter((socket) => ![WebSocket.CLOSING, WebSocket.CLOSED].includes(socket.readyState));
22
+ }
12
23
  async handle(request) {
13
24
  const url = formatUrl(request);
14
25
  const socket = new WebSocket(url);
26
+ if (!this.sockets[url]) {
27
+ this.sockets[url] = [];
28
+ }
29
+ this.sockets[url].push(socket);
15
30
  socket.binaryType = "arraybuffer";
16
- await waitForReady(socket, this.connectionTimeout);
31
+ await this.waitForReady(socket, this.connectionTimeout);
17
32
  const { body } = request;
18
33
  const bodyStream = getIterator(body);
19
- const asyncIterable = connect(socket, bodyStream);
34
+ const asyncIterable = this.connect(socket, bodyStream);
20
35
  const outputPayload = toReadableStream(asyncIterable);
21
36
  return {
22
37
  response: new HttpResponse({
@@ -25,81 +40,87 @@ export class WebSocketHandler {
25
40
  }),
26
41
  };
27
42
  }
28
- }
29
- const waitForReady = (socket, connectionTimeout) => new Promise((resolve, reject) => {
30
- const timeout = setTimeout(() => {
31
- reject({
32
- $metadata: {
33
- httpStatusCode: 500,
34
- },
43
+ waitForReady(socket, connectionTimeout) {
44
+ return new Promise((resolve, reject) => {
45
+ const timeout = setTimeout(() => {
46
+ this.removeNotUsableSockets(socket.url);
47
+ reject({
48
+ $metadata: {
49
+ httpStatusCode: 500,
50
+ },
51
+ });
52
+ }, connectionTimeout);
53
+ socket.onopen = () => {
54
+ clearTimeout(timeout);
55
+ resolve();
56
+ };
35
57
  });
36
- }, connectionTimeout);
37
- socket.onopen = () => {
38
- clearTimeout(timeout);
39
- resolve();
40
- };
41
- });
42
- const connect = (socket, data) => {
43
- let streamError = undefined;
44
- const outputStream = {
45
- [Symbol.asyncIterator]: () => ({
46
- next: () => {
47
- return new Promise((resolve, reject) => {
48
- socket.onerror = (error) => {
49
- socket.onclose = null;
50
- socket.close();
51
- reject(error);
52
- };
53
- socket.onclose = () => {
54
- if (streamError) {
55
- reject(streamError);
56
- }
57
- else {
58
+ }
59
+ connect(socket, data) {
60
+ let streamError = undefined;
61
+ const outputStream = {
62
+ [Symbol.asyncIterator]: () => ({
63
+ next: () => {
64
+ return new Promise((resolve, reject) => {
65
+ let socketErrorOccurred = false;
66
+ socket.onerror = (error) => {
67
+ socketErrorOccurred = true;
68
+ socket.close();
69
+ reject(error);
70
+ };
71
+ socket.onclose = () => {
72
+ this.removeNotUsableSockets(socket.url);
73
+ if (socketErrorOccurred)
74
+ return;
75
+ if (streamError) {
76
+ reject(streamError);
77
+ }
78
+ else {
79
+ resolve({
80
+ done: true,
81
+ value: undefined,
82
+ });
83
+ }
84
+ };
85
+ socket.onmessage = (event) => {
58
86
  resolve({
59
- done: true,
60
- value: undefined,
87
+ done: false,
88
+ value: new Uint8Array(event.data),
61
89
  });
62
- }
63
- };
64
- socket.onmessage = (event) => {
65
- resolve({
66
- done: false,
67
- value: new Uint8Array(event.data),
68
- });
69
- };
70
- });
71
- },
72
- }),
73
- };
74
- const send = async () => {
75
- try {
76
- for await (const inputChunk of data) {
77
- socket.send(inputChunk);
90
+ };
91
+ });
92
+ },
93
+ }),
94
+ };
95
+ const send = async () => {
96
+ try {
97
+ for await (const inputChunk of data) {
98
+ socket.send(inputChunk);
99
+ }
78
100
  }
79
- }
80
- catch (err) {
81
- streamError = err;
82
- }
83
- finally {
84
- socket.close(1000);
85
- }
86
- };
87
- send();
88
- return outputStream;
89
- };
101
+ catch (err) {
102
+ streamError = err;
103
+ }
104
+ finally {
105
+ socket.close(1000);
106
+ }
107
+ };
108
+ send();
109
+ return outputStream;
110
+ }
111
+ }
90
112
  const getIterator = (stream) => {
91
- if (stream[Symbol.asyncIterator])
113
+ if (stream[Symbol.asyncIterator]) {
92
114
  return stream;
93
- else if (isReadableStream(stream)) {
94
- return readableStreamtoIterable(stream);
95
115
  }
96
- else {
97
- return {
98
- [Symbol.asyncIterator]: async function* () {
99
- yield stream;
100
- },
101
- };
116
+ if (isReadableStream(stream)) {
117
+ return readableStreamtoIterable(stream);
102
118
  }
119
+ return {
120
+ [Symbol.asyncIterator]: async function* () {
121
+ yield stream;
122
+ },
123
+ };
103
124
  };
104
125
  const toReadableStream = (asyncIterable) => typeof ReadableStream === "function" ? iterableToReadableStream(asyncIterable) : asyncIterable;
105
126
  const isReadableStream = (payload) => typeof ReadableStream === "function" && payload instanceof ReadableStream;
@@ -6,9 +6,13 @@ export interface WebSocketHandlerOptions {
6
6
  export declare class WebSocketHandler implements HttpHandler {
7
7
  readonly metadata: RequestHandlerMetadata;
8
8
  private readonly connectionTimeout;
9
+ private readonly sockets;
9
10
  constructor({ connectionTimeout }?: WebSocketHandlerOptions);
10
11
  destroy(): void;
12
+ private removeNotUsableSockets;
11
13
  handle(request: HttpRequest): Promise<{
12
14
  response: HttpResponse;
13
15
  }>;
16
+ private waitForReady;
17
+ private connect;
14
18
  }
@@ -16,9 +16,20 @@ export interface WebSocketHandlerOptions {
16
16
  export declare class WebSocketHandler implements HttpHandler {
17
17
  readonly metadata: RequestHandlerMetadata;
18
18
  private readonly connectionTimeout;
19
+ private readonly sockets;
19
20
  constructor({ connectionTimeout }?: WebSocketHandlerOptions);
21
+ /**
22
+ * Destroys the WebSocketHandler.
23
+ * Closes all sockets from the socket pool.
24
+ */
20
25
  destroy(): void;
26
+ /**
27
+ * Removes all closing/closed sockets from the socket pool for URL.
28
+ */
29
+ private removeNotUsableSockets;
21
30
  handle(request: HttpRequest): Promise<{
22
31
  response: HttpResponse;
23
32
  }>;
33
+ private waitForReady;
34
+ private connect;
24
35
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-sdk/middleware-sdk-transcribe-streaming",
3
- "version": "3.258.0",
3
+ "version": "3.266.1",
4
4
  "main": "./dist-cjs/index.js",
5
5
  "module": "./dist-es/index.js",
6
6
  "types": "./dist-types/index.d.ts",
@@ -20,12 +20,12 @@
20
20
  },
21
21
  "license": "Apache-2.0",
22
22
  "dependencies": {
23
- "@aws-sdk/eventstream-serde-browser": "3.258.0",
24
- "@aws-sdk/middleware-signing": "3.257.0",
25
- "@aws-sdk/protocol-http": "3.257.0",
26
- "@aws-sdk/signature-v4": "3.257.0",
27
- "@aws-sdk/types": "3.257.0",
28
- "@aws-sdk/util-format-url": "3.257.0",
23
+ "@aws-sdk/eventstream-serde-browser": "3.266.1",
24
+ "@aws-sdk/middleware-signing": "3.266.1",
25
+ "@aws-sdk/protocol-http": "3.266.1",
26
+ "@aws-sdk/signature-v4": "3.266.1",
27
+ "@aws-sdk/types": "3.266.1",
28
+ "@aws-sdk/util-format-url": "3.266.1",
29
29
  "tslib": "^2.3.1",
30
30
  "uuid": "^8.3.2"
31
31
  },