faux-studio 0.3.9 → 0.3.10
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.js +82 -27
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2267,7 +2267,7 @@ var require_websocket = __commonJS({
|
|
|
2267
2267
|
var protocolVersions = [8, 13];
|
|
2268
2268
|
var readyStates = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"];
|
|
2269
2269
|
var subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;
|
|
2270
|
-
var
|
|
2270
|
+
var WebSocket2 = class _WebSocket extends EventEmitter {
|
|
2271
2271
|
/**
|
|
2272
2272
|
* Create a new `WebSocket`.
|
|
2273
2273
|
*
|
|
@@ -2637,35 +2637,35 @@ var require_websocket = __commonJS({
|
|
|
2637
2637
|
}
|
|
2638
2638
|
}
|
|
2639
2639
|
};
|
|
2640
|
-
Object.defineProperty(
|
|
2640
|
+
Object.defineProperty(WebSocket2, "CONNECTING", {
|
|
2641
2641
|
enumerable: true,
|
|
2642
2642
|
value: readyStates.indexOf("CONNECTING")
|
|
2643
2643
|
});
|
|
2644
|
-
Object.defineProperty(
|
|
2644
|
+
Object.defineProperty(WebSocket2.prototype, "CONNECTING", {
|
|
2645
2645
|
enumerable: true,
|
|
2646
2646
|
value: readyStates.indexOf("CONNECTING")
|
|
2647
2647
|
});
|
|
2648
|
-
Object.defineProperty(
|
|
2648
|
+
Object.defineProperty(WebSocket2, "OPEN", {
|
|
2649
2649
|
enumerable: true,
|
|
2650
2650
|
value: readyStates.indexOf("OPEN")
|
|
2651
2651
|
});
|
|
2652
|
-
Object.defineProperty(
|
|
2652
|
+
Object.defineProperty(WebSocket2.prototype, "OPEN", {
|
|
2653
2653
|
enumerable: true,
|
|
2654
2654
|
value: readyStates.indexOf("OPEN")
|
|
2655
2655
|
});
|
|
2656
|
-
Object.defineProperty(
|
|
2656
|
+
Object.defineProperty(WebSocket2, "CLOSING", {
|
|
2657
2657
|
enumerable: true,
|
|
2658
2658
|
value: readyStates.indexOf("CLOSING")
|
|
2659
2659
|
});
|
|
2660
|
-
Object.defineProperty(
|
|
2660
|
+
Object.defineProperty(WebSocket2.prototype, "CLOSING", {
|
|
2661
2661
|
enumerable: true,
|
|
2662
2662
|
value: readyStates.indexOf("CLOSING")
|
|
2663
2663
|
});
|
|
2664
|
-
Object.defineProperty(
|
|
2664
|
+
Object.defineProperty(WebSocket2, "CLOSED", {
|
|
2665
2665
|
enumerable: true,
|
|
2666
2666
|
value: readyStates.indexOf("CLOSED")
|
|
2667
2667
|
});
|
|
2668
|
-
Object.defineProperty(
|
|
2668
|
+
Object.defineProperty(WebSocket2.prototype, "CLOSED", {
|
|
2669
2669
|
enumerable: true,
|
|
2670
2670
|
value: readyStates.indexOf("CLOSED")
|
|
2671
2671
|
});
|
|
@@ -2678,10 +2678,10 @@ var require_websocket = __commonJS({
|
|
|
2678
2678
|
"readyState",
|
|
2679
2679
|
"url"
|
|
2680
2680
|
].forEach((property) => {
|
|
2681
|
-
Object.defineProperty(
|
|
2681
|
+
Object.defineProperty(WebSocket2.prototype, property, { enumerable: true });
|
|
2682
2682
|
});
|
|
2683
2683
|
["open", "error", "close", "message"].forEach((method) => {
|
|
2684
|
-
Object.defineProperty(
|
|
2684
|
+
Object.defineProperty(WebSocket2.prototype, `on${method}`, {
|
|
2685
2685
|
enumerable: true,
|
|
2686
2686
|
get() {
|
|
2687
2687
|
for (const listener of this.listeners(method)) {
|
|
@@ -2703,9 +2703,9 @@ var require_websocket = __commonJS({
|
|
|
2703
2703
|
}
|
|
2704
2704
|
});
|
|
2705
2705
|
});
|
|
2706
|
-
|
|
2707
|
-
|
|
2708
|
-
module.exports =
|
|
2706
|
+
WebSocket2.prototype.addEventListener = addEventListener;
|
|
2707
|
+
WebSocket2.prototype.removeEventListener = removeEventListener;
|
|
2708
|
+
module.exports = WebSocket2;
|
|
2709
2709
|
function initAsClient(websocket, address, protocols, options) {
|
|
2710
2710
|
const opts = {
|
|
2711
2711
|
allowSynchronousEvents: true,
|
|
@@ -2893,7 +2893,7 @@ var require_websocket = __commonJS({
|
|
|
2893
2893
|
});
|
|
2894
2894
|
req.on("upgrade", (res, socket, head) => {
|
|
2895
2895
|
websocket.emit("upgrade", res);
|
|
2896
|
-
if (websocket.readyState !==
|
|
2896
|
+
if (websocket.readyState !== WebSocket2.CONNECTING) return;
|
|
2897
2897
|
req = websocket._req = null;
|
|
2898
2898
|
const upgrade = res.headers.upgrade;
|
|
2899
2899
|
if (upgrade === void 0 || upgrade.toLowerCase() !== "websocket") {
|
|
@@ -2965,7 +2965,7 @@ var require_websocket = __commonJS({
|
|
|
2965
2965
|
}
|
|
2966
2966
|
}
|
|
2967
2967
|
function emitErrorAndClose(websocket, err) {
|
|
2968
|
-
websocket._readyState =
|
|
2968
|
+
websocket._readyState = WebSocket2.CLOSING;
|
|
2969
2969
|
websocket._errorEmitted = true;
|
|
2970
2970
|
websocket.emit("error", err);
|
|
2971
2971
|
websocket.emitClose();
|
|
@@ -2982,7 +2982,7 @@ var require_websocket = __commonJS({
|
|
|
2982
2982
|
return tls.connect(options);
|
|
2983
2983
|
}
|
|
2984
2984
|
function abortHandshake(websocket, stream, message) {
|
|
2985
|
-
websocket._readyState =
|
|
2985
|
+
websocket._readyState = WebSocket2.CLOSING;
|
|
2986
2986
|
const err = new Error(message);
|
|
2987
2987
|
Error.captureStackTrace(err, abortHandshake);
|
|
2988
2988
|
if (stream.setHeader) {
|
|
@@ -3057,9 +3057,9 @@ var require_websocket = __commonJS({
|
|
|
3057
3057
|
}
|
|
3058
3058
|
function senderOnError(err) {
|
|
3059
3059
|
const websocket = this[kWebSocket];
|
|
3060
|
-
if (websocket.readyState ===
|
|
3061
|
-
if (websocket.readyState ===
|
|
3062
|
-
websocket._readyState =
|
|
3060
|
+
if (websocket.readyState === WebSocket2.CLOSED) return;
|
|
3061
|
+
if (websocket.readyState === WebSocket2.OPEN) {
|
|
3062
|
+
websocket._readyState = WebSocket2.CLOSING;
|
|
3063
3063
|
setCloseTimer(websocket);
|
|
3064
3064
|
}
|
|
3065
3065
|
this._socket.end();
|
|
@@ -3079,7 +3079,7 @@ var require_websocket = __commonJS({
|
|
|
3079
3079
|
this.removeListener("close", socketOnClose);
|
|
3080
3080
|
this.removeListener("data", socketOnData);
|
|
3081
3081
|
this.removeListener("end", socketOnEnd);
|
|
3082
|
-
websocket._readyState =
|
|
3082
|
+
websocket._readyState = WebSocket2.CLOSING;
|
|
3083
3083
|
if (!this._readableState.endEmitted && !websocket._closeFrameReceived && !websocket._receiver._writableState.errorEmitted && this._readableState.length !== 0) {
|
|
3084
3084
|
const chunk = this.read(this._readableState.length);
|
|
3085
3085
|
websocket._receiver.write(chunk);
|
|
@@ -3101,7 +3101,7 @@ var require_websocket = __commonJS({
|
|
|
3101
3101
|
}
|
|
3102
3102
|
function socketOnEnd() {
|
|
3103
3103
|
const websocket = this[kWebSocket];
|
|
3104
|
-
websocket._readyState =
|
|
3104
|
+
websocket._readyState = WebSocket2.CLOSING;
|
|
3105
3105
|
websocket._receiver.end();
|
|
3106
3106
|
this.end();
|
|
3107
3107
|
}
|
|
@@ -3110,7 +3110,7 @@ var require_websocket = __commonJS({
|
|
|
3110
3110
|
this.removeListener("error", socketOnError);
|
|
3111
3111
|
this.on("error", NOOP);
|
|
3112
3112
|
if (websocket) {
|
|
3113
|
-
websocket._readyState =
|
|
3113
|
+
websocket._readyState = WebSocket2.CLOSING;
|
|
3114
3114
|
this.destroy();
|
|
3115
3115
|
}
|
|
3116
3116
|
}
|
|
@@ -3121,7 +3121,7 @@ var require_websocket = __commonJS({
|
|
|
3121
3121
|
var require_stream = __commonJS({
|
|
3122
3122
|
"node_modules/ws/lib/stream.js"(exports, module) {
|
|
3123
3123
|
"use strict";
|
|
3124
|
-
var
|
|
3124
|
+
var WebSocket2 = require_websocket();
|
|
3125
3125
|
var { Duplex } = __require("stream");
|
|
3126
3126
|
function emitClose(stream) {
|
|
3127
3127
|
stream.emit("close");
|
|
@@ -3271,7 +3271,7 @@ var require_websocket_server = __commonJS({
|
|
|
3271
3271
|
var extension = require_extension();
|
|
3272
3272
|
var PerMessageDeflate = require_permessage_deflate();
|
|
3273
3273
|
var subprotocol = require_subprotocol();
|
|
3274
|
-
var
|
|
3274
|
+
var WebSocket2 = require_websocket();
|
|
3275
3275
|
var { CLOSE_TIMEOUT, GUID, kWebSocket } = require_constants();
|
|
3276
3276
|
var keyRegex = /^[+/0-9A-Za-z]{22}==$/;
|
|
3277
3277
|
var RUNNING = 0;
|
|
@@ -3331,7 +3331,7 @@ var require_websocket_server = __commonJS({
|
|
|
3331
3331
|
host: null,
|
|
3332
3332
|
path: null,
|
|
3333
3333
|
port: null,
|
|
3334
|
-
WebSocket:
|
|
3334
|
+
WebSocket: WebSocket2,
|
|
3335
3335
|
...options
|
|
3336
3336
|
};
|
|
3337
3337
|
if (options.port == null && !options.server && !options.noServer || options.port != null && (options.server || options.noServer) || options.server && options.noServer) {
|
|
@@ -11191,6 +11191,7 @@ var PluginWsServer = class {
|
|
|
11191
11191
|
// Server Lifecycle
|
|
11192
11192
|
// -------------------------------------------------------------------------
|
|
11193
11193
|
async start() {
|
|
11194
|
+
await this.shutdownExisting();
|
|
11194
11195
|
for (let port = DEFAULT_PORT; port < DEFAULT_PORT + PORT_RANGE; port++) {
|
|
11195
11196
|
try {
|
|
11196
11197
|
await this.listen(port);
|
|
@@ -11206,6 +11207,53 @@ var PluginWsServer = class {
|
|
|
11206
11207
|
`No available port in range ${DEFAULT_PORT}-${DEFAULT_PORT + PORT_RANGE - 1}. Another faux-studio instance may be running.`
|
|
11207
11208
|
);
|
|
11208
11209
|
}
|
|
11210
|
+
/**
|
|
11211
|
+
* Connect to any existing faux-studio WS servers and tell them to shut down
|
|
11212
|
+
* their listener. This ensures the plugin reconnects to the newest instance.
|
|
11213
|
+
*/
|
|
11214
|
+
async shutdownExisting() {
|
|
11215
|
+
const promises = [];
|
|
11216
|
+
for (let port = DEFAULT_PORT; port < DEFAULT_PORT + PORT_RANGE; port++) {
|
|
11217
|
+
promises.push(this.sendShutdown(port));
|
|
11218
|
+
}
|
|
11219
|
+
await Promise.allSettled(promises);
|
|
11220
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
11221
|
+
}
|
|
11222
|
+
sendShutdown(port) {
|
|
11223
|
+
return new Promise((resolve) => {
|
|
11224
|
+
try {
|
|
11225
|
+
const ws = new import_websocket.default(`ws://127.0.0.1:${port}`);
|
|
11226
|
+
const timer = setTimeout(() => {
|
|
11227
|
+
try {
|
|
11228
|
+
ws.close();
|
|
11229
|
+
} catch {
|
|
11230
|
+
}
|
|
11231
|
+
resolve();
|
|
11232
|
+
}, 1e3);
|
|
11233
|
+
ws.on("open", () => {
|
|
11234
|
+
ws.send(JSON.stringify({ type: "shutdown" }));
|
|
11235
|
+
clearTimeout(timer);
|
|
11236
|
+
setTimeout(() => {
|
|
11237
|
+
try {
|
|
11238
|
+
ws.close();
|
|
11239
|
+
} catch {
|
|
11240
|
+
}
|
|
11241
|
+
resolve();
|
|
11242
|
+
}, 200);
|
|
11243
|
+
});
|
|
11244
|
+
ws.on("error", () => {
|
|
11245
|
+
clearTimeout(timer);
|
|
11246
|
+
resolve();
|
|
11247
|
+
});
|
|
11248
|
+
ws.on("close", () => {
|
|
11249
|
+
clearTimeout(timer);
|
|
11250
|
+
resolve();
|
|
11251
|
+
});
|
|
11252
|
+
} catch {
|
|
11253
|
+
resolve();
|
|
11254
|
+
}
|
|
11255
|
+
});
|
|
11256
|
+
}
|
|
11209
11257
|
listen(port) {
|
|
11210
11258
|
return new Promise((resolve, reject) => {
|
|
11211
11259
|
const wss = new import_websocket_server.default({ port, host: "127.0.0.1" });
|
|
@@ -11266,6 +11314,13 @@ var PluginWsServer = class {
|
|
|
11266
11314
|
} catch {
|
|
11267
11315
|
return;
|
|
11268
11316
|
}
|
|
11317
|
+
if (!identified && msg.type === "shutdown") {
|
|
11318
|
+
clearTimeout(handshakeTimeout);
|
|
11319
|
+
ws.close(1e3, "Shutdown requested");
|
|
11320
|
+
log("Shutdown requested by newer faux-studio instance \u2014 releasing port");
|
|
11321
|
+
this.close();
|
|
11322
|
+
return;
|
|
11323
|
+
}
|
|
11269
11324
|
if (!identified && msg.type === "handshake") {
|
|
11270
11325
|
clearTimeout(handshakeTimeout);
|
|
11271
11326
|
identified = true;
|
|
@@ -25570,7 +25625,7 @@ Resources provide quick read-only access to Figma state without tool calls:
|
|
|
25570
25625
|
- Create components for reusable UI patterns.`;
|
|
25571
25626
|
function createMcpServer(deps) {
|
|
25572
25627
|
const server2 = new Server(
|
|
25573
|
-
{ name: "faux-studio", version: "0.3.
|
|
25628
|
+
{ name: "faux-studio", version: "0.3.10" },
|
|
25574
25629
|
{
|
|
25575
25630
|
capabilities: { tools: { listChanged: true }, resources: {}, logging: {} },
|
|
25576
25631
|
instructions: INSTRUCTIONS
|