| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| import 'dart:async'; |
| import 'dart:convert'; |
| import 'dart:js_interop'; |
| |
| import 'package:stream_channel/stream_channel.dart'; |
| |
| @JS('process.argv') |
| external JSArray<JSString> get _args; |
| |
| extension type _Net._(JSObject _) { |
| external _Socket connect(int port); |
| } |
| |
| extension type _Socket._(JSObject _) { |
| external void setEncoding(JSString encoding); |
| external void on(JSString event, JSFunction callback); |
| external void write(JSString data); |
| } |
| |
| /// Returns a [StreamChannel] of JSON-encodable objects that communicates over a |
| /// socket whose port is given by `process.argv[2]`. |
| Future<StreamChannel<Object?>> socketChannel() async { |
| final net = (await importModule('node:net'.toJS).toDart) as _Net; |
| |
| var socket = net.connect(int.parse(_args.toDart[2].toDart)); |
| socket.setEncoding('utf8'.toJS); |
| |
| var socketSink = StreamController<Object?>(sync: true) |
| ..stream.listen((event) => socket.write('${jsonEncode(event)}\n'.toJS)); |
| |
| var socketStream = StreamController<String>(sync: true); |
| socket.on( |
| 'data'.toJS, |
| ((JSString chunk) => socketStream.add(chunk.toDart)).toJS, |
| ); |
| |
| return StreamChannel.withCloseGuarantee( |
| socketStream.stream.transform(const LineSplitter()).map(jsonDecode), |
| socketSink); |
| } |