blob: 95e81de963601bf36ef711674b095c4ac31d3632 [file] [log] [blame]
// 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);
}