Skip to content

Instantly share code, notes, and snippets.

@sionyx
Created January 25, 2022 13:30
Show Gist options
  • Save sionyx/1d2476ca2cd88a16a119e6dd17a5c89e to your computer and use it in GitHub Desktop.
Save sionyx/1d2476ca2cd88a16a119e6dd17a5c89e to your computer and use it in GitHub Desktop.
import { FoxgloveServer } from "@foxglove/ws-protocol";
import Debug from "debug";
import { WebSocketServer } from "ws";
const log = Debug("foxglove:sysmon");
Debug.enable("foxglove:*");
// eslint-disable-next-line @typescript-eslint/promise-function-async
function delay(durationSec: number) {
return new Promise((resolve) => setTimeout(resolve, durationSec * 1000));
}
async function main() {
const server = new FoxgloveServer({ name: "marker" });
const port = 8765;
const ws = new WebSocketServer({
port,
handleProtocols: (protocols) => server.handleProtocols(protocols),
});
ws.on("listening", () => {
console.log(`📡 Server listening on localhost:${port}`);
});
ws.on("connection", (conn, req) => {
const name = `${req.socket.remoteAddress!}:${req.socket.remotePort!}`;
server.handleConnection(conn, name);
});
const ch0 = server.addChannel({
topic: "/tf",
encoding: "protobuf",
schemaName: "ros.tf2_msgs.TFMessage",
schema: "CokBCjhtb2R1bGVzL2NvbnRyaWIvY3liZXJfcm9zYnJpZGdlL3Jvcy9wcm90by9idWlsdGlucy5wcm90bxIDcm9zIiEKBFRpbWUSCwoDc2VjGAEgAigHEgwKBG5zZWMYAiACKAciJQoIRHVyYXRpb24SCwoDc2VjGAEgAigHEgwKBG5zZWMYAiACKAcK4AIKOG1vZHVsZXMvY29udHJpYi9jeWJlcl9yb3NicmlkZ2Uvcm9zL3Byb3RvL3N0ZF9tc2dzLnByb3RvEgxyb3Muc3RkX21zZ3MaOG1vZHVsZXMvY29udHJpYi9jeWJlcl9yb3NicmlkZ2Uvcm9zL3Byb3RvL2J1aWx0aW5zLnByb3RvIjcKCUNvbG9yUkdCQRIJCgFyGAEgAigCEgkKAWcYAiACKAISCQoBYhgDIAIoAhIJCgFhGAQgAigCIicKCER1cmF0aW9uEhsKBGRhdGEYASACKAsyDS5yb3MuRHVyYXRpb24iQQoGSGVhZGVyEgsKA3NlcRgBIAIoDRIYCgVzdGFtcBgCIAIoCzIJLnJvcy5UaW1lEhAKCGZyYW1lX2lkGAMgAigJIhYKBlN0cmluZxIMCgRkYXRhGAEgAigJIh8KBFRpbWUSFwoEZGF0YRgBIAIoCzIJLnJvcy5UaW1lCs0BCjhtb2R1bGVzL2NvbnRyaWIvY3liZXJfcm9zYnJpZGdlL3Jvcy9wcm90by90ZjJfbXNncy5wcm90bxIMcm9zLnRmMl9tc2dzGj1tb2R1bGVzL2NvbnRyaWIvY3liZXJfcm9zYnJpZGdlL3Jvcy9wcm90by9nZW9tZXRyeV9tc2dzLnByb3RvIkQKCVRGTWVzc2FnZRI3Cgp0cmFuc2Zvcm1zGAEgAygLMiMucm9zLmdlb21ldHJ5X21zZ3MuVHJhbnNmb3JtU3RhbXBlZArGFQo9bW9kdWxlcy9jb250cmliL2N5YmVyX3Jvc2JyaWRnZS9yb3MvcHJvdG8vZ2VvbWV0cnlfbXNncy5wcm90bxIRcm9zLmdlb21ldHJ5X21zZ3MaOG1vZHVsZXMvY29udHJpYi9jeWJlcl9yb3NicmlkZ2Uvcm9zL3Byb3RvL3N0ZF9tc2dzLnByb3RvImAKBUFjY2VsEioKBmxpbmVhchgBIAIoCzIaLnJvcy5nZW9tZXRyeV9tc2dzLlZlY3RvcjMSKwoHYW5ndWxhchgCIAIoCzIaLnJvcy5nZW9tZXRyeV9tc2dzLlZlY3RvcjMiXQoMQWNjZWxTdGFtcGVkEiQKBmhlYWRlchgBIAIoCzIULnJvcy5zdGRfbXNncy5IZWFkZXISJwoFYWNjZWwYAiACKAsyGC5yb3MuZ2VvbWV0cnlfbXNncy5BY2NlbCJSChNBY2NlbFdpdGhDb3ZhcmlhbmNlEicKBWFjY2VsGAEgAigLMhgucm9zLmdlb21ldHJ5X21zZ3MuQWNjZWwSEgoKY292YXJpYW5jZRgCIAMoASJ5ChpBY2NlbFdpdGhDb3ZhcmlhbmNlU3RhbXBlZBIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEjUKBWFjY2VsGAIgAigLMiYucm9zLmdlb21ldHJ5X21zZ3MuQWNjZWxXaXRoQ292YXJpYW5jZSKLAQoHSW5lcnRpYRIJCgFtGAEgAigBEicKA2NvbRgCIAIoCzIaLnJvcy5nZW9tZXRyeV9tc2dzLlZlY3RvcjMSCwoDaXh4GAMgAigBEgsKA2l4eRgEIAIoARILCgNpeHoYBSACKAESCwoDaXl5GAYgAigBEgsKA2l5ehgHIAIoARILCgNpenoYCCACKAEiYwoOSW5lcnRpYVN0YW1wZWQSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchIrCgdpbmVydGlhGAIgAigLMhoucm9zLmdlb21ldHJ5X21zZ3MuSW5lcnRpYSIoCgVQb2ludBIJCgF4GAEgAigBEgkKAXkYAiACKAESCQoBehgDIAIoASIqCgdQb2ludDMyEgkKAXgYASACKAISCQoBeRgCIAIoAhIJCgF6GAMgAigCIl0KDFBvaW50U3RhbXBlZBIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEicKBXBvaW50GAIgAigLMhgucm9zLmdlb21ldHJ5X21zZ3MuUG9pbnQiNQoHUG9seWdvbhIqCgZwb2ludHMYASADKAsyGi5yb3MuZ2VvbWV0cnlfbXNncy5Qb2ludDMyImMKDlBvbHlnb25TdGFtcGVkEiQKBmhlYWRlchgBIAIoCzIULnJvcy5zdGRfbXNncy5IZWFkZXISKwoHcG9seWdvbhgCIAIoCzIaLnJvcy5nZW9tZXRyeV9tc2dzLlBvbHlnb24iZgoEUG9zZRIqCghwb3NpdGlvbhgBIAIoCzIYLnJvcy5nZW9tZXRyeV9tc2dzLlBvaW50EjIKC29yaWVudGF0aW9uGAIgAigLMh0ucm9zLmdlb21ldHJ5X21zZ3MuUXVhdGVybmlvbiJZCglQb3NlQXJyYXkSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchImCgVwb3NlcxgCIAMoCzIXLnJvcy5nZW9tZXRyeV9tc2dzLlBvc2UiWgoLUG9zZVN0YW1wZWQSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchIlCgRwb3NlGAIgAigLMhcucm9zLmdlb21ldHJ5X21zZ3MuUG9zZSJPChJQb3NlV2l0aENvdmFyaWFuY2USJQoEcG9zZRgBIAIoCzIXLnJvcy5nZW9tZXRyeV9tc2dzLlBvc2USEgoKY292YXJpYW5jZRgCIAMoASJ2ChlQb3NlV2l0aENvdmFyaWFuY2VTdGFtcGVkEiQKBmhlYWRlchgBIAIoCzIULnJvcy5zdGRfbXNncy5IZWFkZXISMwoEcG9zZRgCIAIoCzIlLnJvcy5nZW9tZXRyeV9tc2dzLlBvc2VXaXRoQ292YXJpYW5jZSI4CgpRdWF0ZXJuaW9uEgkKAXgYASACKAESCQoBeRgCIAIoARIJCgF6GAMgAigBEgkKAXcYBCACKAEibAoRUXVhdGVybmlvblN0YW1wZWQSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchIxCgpxdWF0ZXJuaW9uGAIgAigLMh0ucm9zLmdlb21ldHJ5X21zZ3MuUXVhdGVybmlvbiJtCglUcmFuc2Zvcm0SLwoLdHJhbnNsYXRpb24YASACKAsyGi5yb3MuZ2VvbWV0cnlfbXNncy5WZWN0b3IzEi8KCHJvdGF0aW9uGAIgAigLMh0ucm9zLmdlb21ldHJ5X21zZ3MuUXVhdGVybmlvbiKBAQoQVHJhbnNmb3JtU3RhbXBlZBIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEhYKDmNoaWxkX2ZyYW1lX2lkGAIgAigJEi8KCXRyYW5zZm9ybRgDIAIoCzIcLnJvcy5nZW9tZXRyeV9tc2dzLlRyYW5zZm9ybSJgCgVUd2lzdBIqCgZsaW5lYXIYASACKAsyGi5yb3MuZ2VvbWV0cnlfbXNncy5WZWN0b3IzEisKB2FuZ3VsYXIYAiACKAsyGi5yb3MuZ2VvbWV0cnlfbXNncy5WZWN0b3IzIl0KDFR3aXN0U3RhbXBlZBIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEicKBXR3aXN0GAIgAigLMhgucm9zLmdlb21ldHJ5X21zZ3MuVHdpc3QiUgoTVHdpc3RXaXRoQ292YXJpYW5jZRInCgV0d2lzdBgBIAIoCzIYLnJvcy5nZW9tZXRyeV9tc2dzLlR3aXN0EhIKCmNvdmFyaWFuY2UYAiADKAEieQoaVHdpc3RXaXRoQ292YXJpYW5jZVN0YW1wZWQSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchI1CgV0d2lzdBgCIAIoCzImLnJvcy5nZW9tZXRyeV9tc2dzLlR3aXN0V2l0aENvdmFyaWFuY2UiKgoHVmVjdG9yMxIJCgF4GAEgAigBEgkKAXkYAiACKAESCQoBehgDIAIoASJiCg5WZWN0b3IzU3RhbXBlZBIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEioKBnZlY3RvchgCIAIoCzIaLnJvcy5nZW9tZXRyeV9tc2dzLlZlY3RvcjMiXwoGV3JlbmNoEikKBWZvcmNlGAEgAigLMhoucm9zLmdlb21ldHJ5X21zZ3MuVmVjdG9yMxIqCgZ0b3JxdWUYAiACKAsyGi5yb3MuZ2VvbWV0cnlfbXNncy5WZWN0b3IzImAKDVdyZW5jaFN0YW1wZWQSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchIpCgZ3cmVuY2gYAiACKAsyGS5yb3MuZ2VvbWV0cnlfbXNncy5XcmVuY2g=",
});
const ch1 = server.addChannel({
topic: "/marker/one",
encoding: "protobuf",
schemaName: "ros.visualization_msgs.MarkerArray",
schema: "CuACCjhtb2R1bGVzL2NvbnRyaWIvY3liZXJfcm9zYnJpZGdlL3Jvcy9wcm90by9zdGRfbXNncy5wcm90bxIMcm9zLnN0ZF9tc2dzGjhtb2R1bGVzL2NvbnRyaWIvY3liZXJfcm9zYnJpZGdlL3Jvcy9wcm90by9idWlsdGlucy5wcm90byI3CglDb2xvclJHQkESCQoBchgBIAIoAhIJCgFnGAIgAigCEgkKAWIYAyACKAISCQoBYRgEIAIoAiInCghEdXJhdGlvbhIbCgRkYXRhGAEgAigLMg0ucm9zLkR1cmF0aW9uIkEKBkhlYWRlchILCgNzZXEYASACKA0SGAoFc3RhbXAYAiACKAsyCS5yb3MuVGltZRIQCghmcmFtZV9pZBgDIAIoCSIWCgZTdHJpbmcSDAoEZGF0YRgBIAIoCSIfCgRUaW1lEhcKBGRhdGEYASACKAsyCS5yb3MuVGltZQrGFQo9bW9kdWxlcy9jb250cmliL2N5YmVyX3Jvc2JyaWRnZS9yb3MvcHJvdG8vZ2VvbWV0cnlfbXNncy5wcm90bxIRcm9zLmdlb21ldHJ5X21zZ3MaOG1vZHVsZXMvY29udHJpYi9jeWJlcl9yb3NicmlkZ2Uvcm9zL3Byb3RvL3N0ZF9tc2dzLnByb3RvImAKBUFjY2VsEioKBmxpbmVhchgBIAIoCzIaLnJvcy5nZW9tZXRyeV9tc2dzLlZlY3RvcjMSKwoHYW5ndWxhchgCIAIoCzIaLnJvcy5nZW9tZXRyeV9tc2dzLlZlY3RvcjMiXQoMQWNjZWxTdGFtcGVkEiQKBmhlYWRlchgBIAIoCzIULnJvcy5zdGRfbXNncy5IZWFkZXISJwoFYWNjZWwYAiACKAsyGC5yb3MuZ2VvbWV0cnlfbXNncy5BY2NlbCJSChNBY2NlbFdpdGhDb3ZhcmlhbmNlEicKBWFjY2VsGAEgAigLMhgucm9zLmdlb21ldHJ5X21zZ3MuQWNjZWwSEgoKY292YXJpYW5jZRgCIAMoASJ5ChpBY2NlbFdpdGhDb3ZhcmlhbmNlU3RhbXBlZBIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEjUKBWFjY2VsGAIgAigLMiYucm9zLmdlb21ldHJ5X21zZ3MuQWNjZWxXaXRoQ292YXJpYW5jZSKLAQoHSW5lcnRpYRIJCgFtGAEgAigBEicKA2NvbRgCIAIoCzIaLnJvcy5nZW9tZXRyeV9tc2dzLlZlY3RvcjMSCwoDaXh4GAMgAigBEgsKA2l4eRgEIAIoARILCgNpeHoYBSACKAESCwoDaXl5GAYgAigBEgsKA2l5ehgHIAIoARILCgNpenoYCCACKAEiYwoOSW5lcnRpYVN0YW1wZWQSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchIrCgdpbmVydGlhGAIgAigLMhoucm9zLmdlb21ldHJ5X21zZ3MuSW5lcnRpYSIoCgVQb2ludBIJCgF4GAEgAigBEgkKAXkYAiACKAESCQoBehgDIAIoASIqCgdQb2ludDMyEgkKAXgYASACKAISCQoBeRgCIAIoAhIJCgF6GAMgAigCIl0KDFBvaW50U3RhbXBlZBIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEicKBXBvaW50GAIgAigLMhgucm9zLmdlb21ldHJ5X21zZ3MuUG9pbnQiNQoHUG9seWdvbhIqCgZwb2ludHMYASADKAsyGi5yb3MuZ2VvbWV0cnlfbXNncy5Qb2ludDMyImMKDlBvbHlnb25TdGFtcGVkEiQKBmhlYWRlchgBIAIoCzIULnJvcy5zdGRfbXNncy5IZWFkZXISKwoHcG9seWdvbhgCIAIoCzIaLnJvcy5nZW9tZXRyeV9tc2dzLlBvbHlnb24iZgoEUG9zZRIqCghwb3NpdGlvbhgBIAIoCzIYLnJvcy5nZW9tZXRyeV9tc2dzLlBvaW50EjIKC29yaWVudGF0aW9uGAIgAigLMh0ucm9zLmdlb21ldHJ5X21zZ3MuUXVhdGVybmlvbiJZCglQb3NlQXJyYXkSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchImCgVwb3NlcxgCIAMoCzIXLnJvcy5nZW9tZXRyeV9tc2dzLlBvc2UiWgoLUG9zZVN0YW1wZWQSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchIlCgRwb3NlGAIgAigLMhcucm9zLmdlb21ldHJ5X21zZ3MuUG9zZSJPChJQb3NlV2l0aENvdmFyaWFuY2USJQoEcG9zZRgBIAIoCzIXLnJvcy5nZW9tZXRyeV9tc2dzLlBvc2USEgoKY292YXJpYW5jZRgCIAMoASJ2ChlQb3NlV2l0aENvdmFyaWFuY2VTdGFtcGVkEiQKBmhlYWRlchgBIAIoCzIULnJvcy5zdGRfbXNncy5IZWFkZXISMwoEcG9zZRgCIAIoCzIlLnJvcy5nZW9tZXRyeV9tc2dzLlBvc2VXaXRoQ292YXJpYW5jZSI4CgpRdWF0ZXJuaW9uEgkKAXgYASACKAESCQoBeRgCIAIoARIJCgF6GAMgAigBEgkKAXcYBCACKAEibAoRUXVhdGVybmlvblN0YW1wZWQSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchIxCgpxdWF0ZXJuaW9uGAIgAigLMh0ucm9zLmdlb21ldHJ5X21zZ3MuUXVhdGVybmlvbiJtCglUcmFuc2Zvcm0SLwoLdHJhbnNsYXRpb24YASACKAsyGi5yb3MuZ2VvbWV0cnlfbXNncy5WZWN0b3IzEi8KCHJvdGF0aW9uGAIgAigLMh0ucm9zLmdlb21ldHJ5X21zZ3MuUXVhdGVybmlvbiKBAQoQVHJhbnNmb3JtU3RhbXBlZBIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEhYKDmNoaWxkX2ZyYW1lX2lkGAIgAigJEi8KCXRyYW5zZm9ybRgDIAIoCzIcLnJvcy5nZW9tZXRyeV9tc2dzLlRyYW5zZm9ybSJgCgVUd2lzdBIqCgZsaW5lYXIYASACKAsyGi5yb3MuZ2VvbWV0cnlfbXNncy5WZWN0b3IzEisKB2FuZ3VsYXIYAiACKAsyGi5yb3MuZ2VvbWV0cnlfbXNncy5WZWN0b3IzIl0KDFR3aXN0U3RhbXBlZBIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEicKBXR3aXN0GAIgAigLMhgucm9zLmdlb21ldHJ5X21zZ3MuVHdpc3QiUgoTVHdpc3RXaXRoQ292YXJpYW5jZRInCgV0d2lzdBgBIAIoCzIYLnJvcy5nZW9tZXRyeV9tc2dzLlR3aXN0EhIKCmNvdmFyaWFuY2UYAiADKAEieQoaVHdpc3RXaXRoQ292YXJpYW5jZVN0YW1wZWQSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchI1CgV0d2lzdBgCIAIoCzImLnJvcy5nZW9tZXRyeV9tc2dzLlR3aXN0V2l0aENvdmFyaWFuY2UiKgoHVmVjdG9yMxIJCgF4GAEgAigBEgkKAXkYAiACKAESCQoBehgDIAIoASJiCg5WZWN0b3IzU3RhbXBlZBIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEioKBnZlY3RvchgCIAIoCzIaLnJvcy5nZW9tZXRyeV9tc2dzLlZlY3RvcjMiXwoGV3JlbmNoEikKBWZvcmNlGAEgAigLMhoucm9zLmdlb21ldHJ5X21zZ3MuVmVjdG9yMxIqCgZ0b3JxdWUYAiACKAsyGi5yb3MuZ2VvbWV0cnlfbXNncy5WZWN0b3IzImAKDVdyZW5jaFN0YW1wZWQSJAoGaGVhZGVyGAEgAigLMhQucm9zLnN0ZF9tc2dzLkhlYWRlchIpCgZ3cmVuY2gYAiACKAsyGS5yb3MuZ2VvbWV0cnlfbXNncy5XcmVuY2gKohMKQm1vZHVsZXMvY29udHJpYi9jeWJlcl9yb3NicmlkZ2Uvcm9zL3Byb3RvL3Zpc3VhbGl6YXRpb25fbXNncy5wcm90bxIWcm9zLnZpc3VhbGl6YXRpb25fbXNncxo4bW9kdWxlcy9jb250cmliL2N5YmVyX3Jvc2JyaWRnZS9yb3MvcHJvdG8vYnVpbHRpbnMucHJvdG8aPW1vZHVsZXMvY29udHJpYi9jeWJlcl9yb3NicmlkZ2Uvcm9zL3Byb3RvL2dlb21ldHJ5X21zZ3MucHJvdG8aOG1vZHVsZXMvY29udHJpYi9jeWJlcl9yb3NicmlkZ2Uvcm9zL3Byb3RvL3N0ZF9tc2dzLnByb3RvIvgDCgtJbWFnZU1hcmtlchIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEgoKAm5zGAIgAigJEgoKAmlkGAMgAigFEgwKBHR5cGUYBCACKAUSDgoGYWN0aW9uGAUgAigFEioKCHBvc2l0aW9uGAYgAigLMhgucm9zLmdlb21ldHJ5X21zZ3MuUG9pbnQSDQoFc2NhbGUYByACKAISLgoNb3V0bGluZV9jb2xvchgIIAIoCzIXLnJvcy5zdGRfbXNncy5Db2xvclJHQkESDgoGZmlsbGVkGAkgAigFEisKCmZpbGxfY29sb3IYCiACKAsyFy5yb3Muc3RkX21zZ3MuQ29sb3JSR0JBEh8KCGxpZmV0aW1lGAsgAigLMg0ucm9zLkR1cmF0aW9uEigKBnBvaW50cxgMIAMoCzIYLnJvcy5nZW9tZXRyeV9tc2dzLlBvaW50Ei8KDm91dGxpbmVfY29sb3JzGA0gAygLMhcucm9zLnN0ZF9tc2dzLkNvbG9yUkdCQSJKCgRUeXBlEgoKBkNJUkNMRRAAEg4KCkxJTkVfU1RSSVAQARINCglMSU5FX0xJU1QQAhILCgdQT0xZR09OEAMSCgoGUE9JTlRTEAQiHQoGQWN0aW9uEgcKA0FERBAAEgoKBlJFTU9WRRABIo8CChFJbnRlcmFjdGl2ZU1hcmtlchIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEiUKBHBvc2UYAiACKAsyFy5yb3MuZ2VvbWV0cnlfbXNncy5Qb3NlEgwKBG5hbWUYAyACKAkSEwoLZGVzY3JpcHRpb24YBCACKAkSDQoFc2NhbGUYBSACKAISNwoMbWVudV9lbnRyaWVzGAYgAygLMiEucm9zLnZpc3VhbGl6YXRpb25fbXNncy5NZW51RW50cnkSQgoIY29udHJvbHMYByADKAsyMC5yb3MudmlzdWFsaXphdGlvbl9tc2dzLkludGVyYWN0aXZlTWFya2VyQ29udHJvbCL5AwoYSW50ZXJhY3RpdmVNYXJrZXJDb250cm9sEgwKBG5hbWUYASACKAkSMgoLb3JpZW50YXRpb24YAiACKAsyHS5yb3MuZ2VvbWV0cnlfbXNncy5RdWF0ZXJuaW9uEhgKEG9yaWVudGF0aW9uX21vZGUYAyACKAUSGAoQaW50ZXJhY3Rpb25fbW9kZRgEIAIoBRIWCg5hbHdheXNfdmlzaWJsZRgFIAIoCBIvCgdtYXJrZXJzGAYgAygLMh4ucm9zLnZpc3VhbGl6YXRpb25fbXNncy5NYXJrZXISJgoeaW5kZXBlbmRlbnRfbWFya2VyX29yaWVudGF0aW9uGAcgAigIEhMKC2Rlc2NyaXB0aW9uGAggAigJIjsKEE9yaWVudGF0aW9uX01vZGUSCwoHSU5IRVJJVBAAEgkKBUZJWEVEEAESDwoLVklFV19GQUNJTkcQAiKjAQoQSW50ZXJhY3Rpb25fTW9kZRIICgROT05FEAASCAoETUVOVRABEgoKBkJVVFRPThACEg0KCU1PVkVfQVhJUxADEg4KCk1PVkVfUExBTkUQBBIPCgtST1RBVEVfQVhJUxAFEg8KC01PVkVfUk9UQVRFEAYSCwoHTU9WRV8zRBAHEg0KCVJPVEFURV8zRBAIEhIKDk1PVkVfUk9UQVRFXzNEEAkiqwUKBk1hcmtlchIkCgZoZWFkZXIYASACKAsyFC5yb3Muc3RkX21zZ3MuSGVhZGVyEgoKAm5zGAIgAigJEgoKAmlkGAMgAigFEgwKBHR5cGUYBCABKAUSDgoGYWN0aW9uGAUgAigFEiUKBHBvc2UYBiABKAsyFy5yb3MuZ2VvbWV0cnlfbXNncy5Qb3NlEikKBXNjYWxlGAcgASgLMhoucm9zLmdlb21ldHJ5X21zZ3MuVmVjdG9yMxImCgVjb2xvchgIIAEoCzIXLnJvcy5zdGRfbXNncy5Db2xvclJHQkESHwoIbGlmZXRpbWUYCSABKAsyDS5yb3MuRHVyYXRpb24SFAoMZnJhbWVfbG9ja2VkGAogASgIEigKBnBvaW50cxgLIAMoCzIYLnJvcy5nZW9tZXRyeV9tc2dzLlBvaW50EicKBmNvbG9ycxgMIAMoCzIXLnJvcy5zdGRfbXNncy5Db2xvclJHQkESDAoEdGV4dBgNIAEoCRIVCg1tZXNoX3Jlc291cmNlGA4gASgJEiMKG21lc2hfdXNlX2VtYmVkZGVkX21hdGVyaWFscxgPIAEoCCK8AQoEVHlwZRIJCgVBUlJPVxAAEggKBENVQkUQARIKCgZTUEhFUkUQAhIMCghDWUxJTkRFUhADEg4KCkxJTkVfU1RSSVAQBBINCglMSU5FX0xJU1QQBRINCglDVUJFX0xJU1QQBhIPCgtTUEhFUkVfTElTVBAHEgoKBlBPSU5UUxAIEhQKEFRFWFRfVklFV19GQUNJTkcQCRIRCg1NRVNIX1JFU09VUkNFEAoSEQoNVFJJQU5HTEVfTElTVBALIjgKBkFjdGlvbhIHCgNBREQQABIKCgZNT0RJRlkQARIKCgZERUxFVEUQAhINCglERUxFVEVBTEwQAyI+CgtNYXJrZXJBcnJheRIvCgdtYXJrZXJzGAEgAygLMh4ucm9zLnZpc3VhbGl6YXRpb25fbXNncy5NYXJrZXIimQEKCU1lbnVFbnRyeRIKCgJpZBgBIAIoDRIRCglwYXJlbnRfaWQYAiACKA0SDQoFdGl0bGUYAyACKAkSDwoHY29tbWFuZBgEIAIoCRIUCgxjb21tYW5kX3R5cGUYBSACKAUiNwoMQ29tbWFuZF9UeXBlEgwKCEZFRURCQUNLEAASCgoGUk9TUlVOEAESDQoJUk9TTEFVTkNIEAIKiQEKOG1vZHVsZXMvY29udHJpYi9jeWJlcl9yb3NicmlkZ2Uvcm9zL3Byb3RvL2J1aWx0aW5zLnByb3RvEgNyb3MiIQoEVGltZRILCgNzZWMYASACKAcSDAoEbnNlYxgCIAIoByIlCghEdXJhdGlvbhILCgNzZWMYASACKAcSDAoEbnNlYxgCIAIoBw==",
});
// const textEncoder = new TextEncoder();
const INTERVAL_SEC = 1;
let controller: AbortController | undefined;
server.on("subscribe", (chanId) => {
if (chanId !== ch1) {
return;
}
log("starting");
if (controller) {
controller.abort();
throw new Error("already running");
}
controller = new AbortController();
void (async function (signal) {
await delay(INTERVAL_SEC);
var fs = require('fs');
var data = "";
try {
data = fs.readFileSync("ws-dump-datalines-hex", 'utf8').toString() as string;
} catch(e: any) {
console.log('Error:', e.stack);
}
let lines = data.split(/\r?\n/);
let buffers = lines.map((line) => {
line = line.replace(new RegExp(" ", 'g'), "");
return Buffer.from(line, 'hex');
});
var index = 0;
var subscription2channel = [ch0, ch1];
while (!signal.aborted) {
let buff = buffers[index] as Buffer;
let subscription = buff.readInt32LE(1);
let channel = subscription2channel[subscription] as number;
let timestamp = buff.readBigUInt64LE(5);
let payload = buff.slice(13);
console.log(`channel ${channel} timestamp ${timestamp} buffer ${payload.toString('hex')}`);
server.sendMessage(
channel,
timestamp,
payload
);
await delay(INTERVAL_SEC);
index++;
index %= lines.length;
}
})(controller.signal);
});
server.on("unsubscribe", (_chanId) => {
log("stopping");
controller?.abort();
controller = undefined;
});
server.on("error", (err) => {
log("server error: %o", err);
});
}
void main();
{
"name": "@foxglove/ws-protocol-examples",
"version": "0.0.0",
"description": "Foxglove WebSocket protocol examples",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/foxglove/ws-protocol.git"
},
"author": {
"name": "Foxglove Technologies",
"email": "[email protected]"
},
"homepage": "https://foxglove.dev/",
"files": [
"dist",
"src"
],
"scripts": {
"start": "tsc -b ../*/tsconfig*.json && ts-node --project tsconfig.cjs.json --files index.ts"
},
"devDependencies": {
"@foxglove/tsconfig": "1.1.0",
"@types/debug": "4.1.7",
"@types/node": "16.11.12",
"@types/ws": "8.2.0",
"ts-node": "10.4.0",
"typescript": "4.4.4"
},
"dependencies": {
"@foxglove/ws-protocol": "^0.0.8",
"debug": "^4",
"tslib": "^2",
"ws": "8.2.3"
}
}
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./dist/cjs",
"module": "commonjs"
}
}
{
"extends": "@foxglove/tsconfig/base",
"include": ["./**/*"],
"compilerOptions": {
"rootDir": "..",
"outDir": "./dist/esm",
"lib": ["es2020", "dom"],
"paths": {
"@foxglove/ws-protocol": ["../ws-protocol/src"]
}
}
}
01 01 00 00 00 00 b2 ca 5d f1 b4 79 16 0a d7 01 0a 1b 08 d3 97 06 12 0a 0d 89 fb 87 60 15 5c 98 e6 2d 1a 09 49 6e 6e 6f 70 6f 6c 69 73 12 09 63 61 72 5f 6d 6f 64 65 6c 18 00 20 0a 28 00 32 43 0a 1b 09 00 7c b3 92 82 03 76 40 11 00 00 86 c0 4d 75 4c 40 19 00 00 00 00 00 00 00 00 12 24 09 00 00 00 20 a3 70 87 3f 11 00 00 00 80 59 15 93 3f 19 00 00 00 80 40 38 e4 3f 21 00 00 00 40 e7 ca e8 3f 3a 1b 09 00 00 00 00 00 00 f0 3f 11 00 00 00 00 00 00 f0 3f 19 00 00 00 00 00 00 f0 3f 42 14 0d 00 00 00 00 15 00 00 00 00 1d 00 00 80 3f 25 00 00 80 3f 4a 0a 0d 01 00 00 00 15 00 00 00 00 50 00 72 1f 68 74 74 70 3a 2f 2f 73 69 6f 6e 79 78 2e 72 75 2f 6d 6f 64 65 6c 73 2f 6d 61 6e 2e 67 6c 62 78 01 0a b9 01 0a 1b 08 d3 97 06 12 0a 0d 89 fb 87 60 15 5c 98 e6 2d 1a 09 49 6e 6e 6f 70 6f 6c 69 73 12 09 63 61 72 5f 74 69 74 6c 65 18 00 20 09 28 00 32 43 0a 1b 09 00 7c b3 92 82 03 76 40 11 00 00 86 c0 4d 75 4c 40 19 00 00 00 00 00 00 00 00 12 24 09 00 00 00 20 a3 70 87 3f 11 00 00 00 80 59 15 93 3f 19 00 00 00 80 40 38 e4 3f 21 00 00 00 40 e7 ca e8 3f 3a 1b 09 00 00 00 00 00 00 f0 3f 11 00 00 00 00 00 00 f0 3f 19 00 00 00 00 00 00 f0 3f 42 14 0d 00 00 80 3f 15 00 00 00 00 1d 00 00 00 00 25 66 66 66 3f 4a 0a 0d 01 00 00 00 15 00 00 00 00 50 00 6a 03 63 61 72
01 01 00 00 00 00 0b 64 5e f1 b4 79 16 0a d7 01 0a 1b 08 d4 97 06 12 0a 0d 89 fb 87 60 15 89 f0 7f 2e 1a 09 49 6e 6e 6f 70 6f 6c 69 73 12 09 63 61 72 5f 6d 6f 64 65 6c 18 00 20 0a 28 00 32 43 0a 1b 09 00 ac 3b 5e 5f 02 76 40 11 00 00 d6 db 61 77 4c 40 19 00 00 00 00 00 00 00 00 12 24 09 00 00 00 40 2a 2a 87 3f 11 00 00 00 00 12 0a 93 3f 19 00 00 00 20 a5 37 e4 3f 21 00 00 00 40 6c cb e8 3f 3a 1b 09 00 00 00 00 00 00 f0 3f 11 00 00 00 00 00 00 f0 3f 19 00 00 00 00 00 00 f0 3f 42 14 0d 00 00 00 00 15 00 00 00 00 1d 00 00 80 3f 25 00 00 80 3f 4a 0a 0d 01 00 00 00 15 00 00 00 00 50 00 72 1f 68 74 74 70 3a 2f 2f 73 69 6f 6e 79 78 2e 72 75 2f 6d 6f 64 65 6c 73 2f 6d 61 6e 2e 67 6c 62 78 01 0a b9 01 0a 1b 08 d4 97 06 12 0a 0d 89 fb 87 60 15 89 f0 7f 2e 1a 09 49 6e 6e 6f 70 6f 6c 69 73 12 09 63 61 72 5f 74 69 74 6c 65 18 00 20 09 28 00 32 43 0a 1b 09 00 ac 3b 5e 5f 02 76 40 11 00 00 d6 db 61 77 4c 40 19 00 00 00 00 00 00 00 00 12 24 09 00 00 00 40 2a 2a 87 3f 11 00 00 00 00 12 0a 93 3f 19 00 00 00 20 a5 37 e4 3f 21 00 00 00 40 6c cb e8 3f 3a 1b 09 00 00 00 00 00 00 f0 3f 11 00 00 00 00 00 00 f0 3f 19 00 00 00 00 00 00 f0 3f 42 14 0d 00 00 80 3f 15 00 00 00 00 1d 00 00 00 00 25 66 66 66 3f 4a 0a 0d 01 00 00 00 15 00 00 00 00 50 00 6a 03 63 61 72
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@cspotcode/[email protected]":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
"@cspotcode/[email protected]":
version "0.7.0"
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
dependencies:
"@cspotcode/source-map-consumer" "0.8.0"
"@foxglove/[email protected]":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@foxglove/tsconfig/-/tsconfig-1.1.0.tgz#48c37fffd6f349c3ee08a60fc62ccf636f3b59a6"
integrity sha512-qZU4MtXVgPhDBFazSEx7yDEuEg8cPHXFQVhBaUABZkCBdcnEE9sxlgEt0gSikF4fRtY6COGIJPVRflnPJXjJKA==
"@foxglove/ws-protocol@^0.0.8":
version "0.0.8"
resolved "https://registry.yarnpkg.com/@foxglove/ws-protocol/-/ws-protocol-0.0.8.tgz#c18aefa06746bb5df894e64778fc6d171c3ee1cd"
integrity sha512-wIME1ejWAAP/2TFOER+fMc8tdU9Ubph/TifO7FxFWxN5iDrj4ZyteEYFVpRpTz3SDGSZGLbhIcVROxAvR9EvPA==
dependencies:
debug "^4"
eventemitter3 "^4.0.7"
tslib "^2"
"@tsconfig/node10@^1.0.7":
version "1.0.8"
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
"@tsconfig/node12@^1.0.7":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
"@tsconfig/node14@^1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
"@tsconfig/node16@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
"@types/[email protected]":
version "4.1.7"
resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==
dependencies:
"@types/ms" "*"
"@types/ms@*":
version "0.7.31"
resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
"@types/node@*":
version "17.0.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.10.tgz#616f16e9d3a2a3d618136b1be244315d95bd7cab"
integrity sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==
"@types/[email protected]":
version "16.11.12"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.12.tgz#ac7fb693ac587ee182c3780c26eb65546a1a3c10"
integrity sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==
"@types/[email protected]":
version "8.2.0"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.0.tgz#75faefbe2328f3b833cb8dc640658328990d04f3"
integrity sha512-cyeefcUCgJlEk+hk2h3N+MqKKsPViQgF5boi9TTHSK+PoR9KWBb/C5ccPcDyAqgsbAYHTwulch725DV84+pSpg==
dependencies:
"@types/node" "*"
acorn-walk@^8.1.1:
version "8.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
acorn@^8.4.1:
version "8.7.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
arg@^4.1.0:
version "4.1.3"
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
debug@^4:
version "4.3.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
dependencies:
ms "2.1.2"
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
eventemitter3@^4.0.7:
version "4.0.7"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
make-error@^1.1.1:
version "1.3.6"
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
[email protected]:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
[email protected]:
version "10.4.0"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7"
integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==
dependencies:
"@cspotcode/source-map-support" "0.7.0"
"@tsconfig/node10" "^1.0.7"
"@tsconfig/node12" "^1.0.7"
"@tsconfig/node14" "^1.0.0"
"@tsconfig/node16" "^1.0.2"
acorn "^8.4.1"
acorn-walk "^8.1.1"
arg "^4.1.0"
create-require "^1.1.0"
diff "^4.0.1"
make-error "^1.1.1"
yn "3.1.1"
tslib@^2:
version "2.3.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
[email protected]:
version "4.4.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c"
integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==
[email protected]:
version "8.2.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
[email protected]:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment