@quenty/studio-bridge 0.1.1-canary.656.73a74af.0 → 0.2.0
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/CHANGELOG.md +37 -1
- package/build-scripts/transform-add-session-attribute.luau +17 -0
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +0 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugin/plugin-injector.d.ts.map +1 -1
- package/dist/src/plugin/plugin-injector.js +11 -34
- package/dist/src/plugin/plugin-injector.js.map +1 -1
- package/dist/src/process/index.d.ts +0 -2
- package/dist/src/process/index.d.ts.map +1 -1
- package/dist/src/process/index.js +0 -1
- package/dist/src/process/index.js.map +1 -1
- package/dist/src/server/studio-bridge-server.d.ts +1 -1
- package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
- package/dist/src/server/studio-bridge-server.js +38 -12
- package/dist/src/server/studio-bridge-server.js.map +1 -1
- package/dist/src/server/studio-bridge-server.test.js +94 -19
- package/dist/src/server/studio-bridge-server.test.js.map +1 -1
- package/dist/src/server/web-socket-protocol.d.ts +7 -1
- package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
- package/dist/src/server/web-socket-protocol.js +8 -4
- package/dist/src/server/web-socket-protocol.js.map +1 -1
- package/dist/src/server/web-socket-protocol.smoke.test.js +18 -9
- package/dist/src/server/web-socket-protocol.smoke.test.js.map +1 -1
- package/dist/src/server/web-socket-protocol.test.js +47 -5
- package/dist/src/server/web-socket-protocol.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/index.ts +0 -1
- package/src/plugin/plugin-injector.ts +19 -45
- package/src/process/index.ts +0 -3
- package/src/server/studio-bridge-server.test.ts +113 -21
- package/src/server/studio-bridge-server.ts +66 -15
- package/src/server/web-socket-protocol.smoke.test.ts +18 -9
- package/src/server/web-socket-protocol.test.ts +61 -5
- package/src/server/web-socket-protocol.ts +15 -4
- package/templates/default-test-place/default.project.json +1 -1
- package/templates/studio-bridge-plugin/default.project.json +1 -1
- package/templates/studio-bridge-plugin/{plugin-template.server.lua → src/StudioBridgePlugin.server.lua} +18 -4
- package/dist/src/process/place-builder.d.ts +0 -16
- package/dist/src/process/place-builder.d.ts.map +0 -1
- package/dist/src/process/place-builder.js +0 -45
- package/dist/src/process/place-builder.js.map +0 -1
- package/src/process/place-builder.ts +0 -63
|
@@ -4,27 +4,31 @@ describe('encodeMessage', () => {
|
|
|
4
4
|
it('encodes a welcome message', () => {
|
|
5
5
|
const json = encodeMessage({
|
|
6
6
|
type: 'welcome',
|
|
7
|
+
sessionId: 'abc-123',
|
|
7
8
|
payload: { sessionId: 'abc-123' },
|
|
8
9
|
});
|
|
9
10
|
const parsed = JSON.parse(json);
|
|
10
11
|
expect(parsed).toEqual({
|
|
11
12
|
type: 'welcome',
|
|
13
|
+
sessionId: 'abc-123',
|
|
12
14
|
payload: { sessionId: 'abc-123' },
|
|
13
15
|
});
|
|
14
16
|
});
|
|
15
17
|
it('encodes a shutdown message', () => {
|
|
16
|
-
const json = encodeMessage({ type: 'shutdown', payload: {} });
|
|
18
|
+
const json = encodeMessage({ type: 'shutdown', sessionId: 'abc-123', payload: {} });
|
|
17
19
|
const parsed = JSON.parse(json);
|
|
18
|
-
expect(parsed).toEqual({ type: 'shutdown', payload: {} });
|
|
20
|
+
expect(parsed).toEqual({ type: 'shutdown', sessionId: 'abc-123', payload: {} });
|
|
19
21
|
});
|
|
20
22
|
it('encodes an execute message', () => {
|
|
21
23
|
const json = encodeMessage({
|
|
22
24
|
type: 'execute',
|
|
25
|
+
sessionId: 'abc-123',
|
|
23
26
|
payload: { script: 'print("hi")' },
|
|
24
27
|
});
|
|
25
28
|
const parsed = JSON.parse(json);
|
|
26
29
|
expect(parsed).toEqual({
|
|
27
30
|
type: 'execute',
|
|
31
|
+
sessionId: 'abc-123',
|
|
28
32
|
payload: { script: 'print("hi")' },
|
|
29
33
|
});
|
|
30
34
|
});
|
|
@@ -34,25 +38,36 @@ describe('decodePluginMessage', () => {
|
|
|
34
38
|
it('decodes a valid hello message', () => {
|
|
35
39
|
const msg = decodePluginMessage(JSON.stringify({
|
|
36
40
|
type: 'hello',
|
|
41
|
+
sessionId: 'test-session',
|
|
37
42
|
payload: { sessionId: 'test-session' },
|
|
38
43
|
}));
|
|
39
44
|
expect(msg).toEqual({
|
|
40
45
|
type: 'hello',
|
|
46
|
+
sessionId: 'test-session',
|
|
41
47
|
payload: { sessionId: 'test-session' },
|
|
42
48
|
});
|
|
43
49
|
});
|
|
44
|
-
it('returns null for hello without sessionId', () => {
|
|
50
|
+
it('returns null for hello without sessionId in payload', () => {
|
|
45
51
|
const msg = decodePluginMessage(JSON.stringify({
|
|
46
52
|
type: 'hello',
|
|
53
|
+
sessionId: 'test-session',
|
|
47
54
|
payload: {},
|
|
48
55
|
}));
|
|
49
56
|
expect(msg).toBeNull();
|
|
50
57
|
});
|
|
58
|
+
it('returns null for hello without top-level sessionId', () => {
|
|
59
|
+
const msg = decodePluginMessage(JSON.stringify({
|
|
60
|
+
type: 'hello',
|
|
61
|
+
payload: { sessionId: 'test-session' },
|
|
62
|
+
}));
|
|
63
|
+
expect(msg).toBeNull();
|
|
64
|
+
});
|
|
51
65
|
});
|
|
52
66
|
describe('output', () => {
|
|
53
67
|
it('decodes a valid output message with multiple entries', () => {
|
|
54
68
|
const msg = decodePluginMessage(JSON.stringify({
|
|
55
69
|
type: 'output',
|
|
70
|
+
sessionId: 'test-session',
|
|
56
71
|
payload: {
|
|
57
72
|
messages: [
|
|
58
73
|
{ level: 'Print', body: 'Hello world' },
|
|
@@ -62,6 +77,7 @@ describe('decodePluginMessage', () => {
|
|
|
62
77
|
}));
|
|
63
78
|
expect(msg).toEqual({
|
|
64
79
|
type: 'output',
|
|
80
|
+
sessionId: 'test-session',
|
|
65
81
|
payload: {
|
|
66
82
|
messages: [
|
|
67
83
|
{ level: 'Print', body: 'Hello world' },
|
|
@@ -73,6 +89,7 @@ describe('decodePluginMessage', () => {
|
|
|
73
89
|
it('filters out invalid entries in messages array', () => {
|
|
74
90
|
const msg = decodePluginMessage(JSON.stringify({
|
|
75
91
|
type: 'output',
|
|
92
|
+
sessionId: 'test-session',
|
|
76
93
|
payload: {
|
|
77
94
|
messages: [
|
|
78
95
|
{ level: 'Print', body: 'valid' },
|
|
@@ -84,6 +101,7 @@ describe('decodePluginMessage', () => {
|
|
|
84
101
|
}));
|
|
85
102
|
expect(msg).toEqual({
|
|
86
103
|
type: 'output',
|
|
104
|
+
sessionId: 'test-session',
|
|
87
105
|
payload: {
|
|
88
106
|
messages: [{ level: 'Print', body: 'valid' }],
|
|
89
107
|
},
|
|
@@ -92,39 +110,59 @@ describe('decodePluginMessage', () => {
|
|
|
92
110
|
it('returns null for output without messages array', () => {
|
|
93
111
|
const msg = decodePluginMessage(JSON.stringify({
|
|
94
112
|
type: 'output',
|
|
113
|
+
sessionId: 'test-session',
|
|
95
114
|
payload: { messages: 'not-an-array' },
|
|
96
115
|
}));
|
|
97
116
|
expect(msg).toBeNull();
|
|
98
117
|
});
|
|
118
|
+
it('returns null for output without top-level sessionId', () => {
|
|
119
|
+
const msg = decodePluginMessage(JSON.stringify({
|
|
120
|
+
type: 'output',
|
|
121
|
+
payload: { messages: [{ level: 'Print', body: 'test' }] },
|
|
122
|
+
}));
|
|
123
|
+
expect(msg).toBeNull();
|
|
124
|
+
});
|
|
99
125
|
});
|
|
100
126
|
describe('scriptComplete', () => {
|
|
101
127
|
it('decodes a successful scriptComplete', () => {
|
|
102
128
|
const msg = decodePluginMessage(JSON.stringify({
|
|
103
129
|
type: 'scriptComplete',
|
|
130
|
+
sessionId: 'test-session',
|
|
104
131
|
payload: { success: true },
|
|
105
132
|
}));
|
|
106
133
|
expect(msg).toEqual({
|
|
107
134
|
type: 'scriptComplete',
|
|
135
|
+
sessionId: 'test-session',
|
|
108
136
|
payload: { success: true, error: undefined },
|
|
109
137
|
});
|
|
110
138
|
});
|
|
111
139
|
it('decodes a failed scriptComplete with error', () => {
|
|
112
140
|
const msg = decodePluginMessage(JSON.stringify({
|
|
113
141
|
type: 'scriptComplete',
|
|
142
|
+
sessionId: 'test-session',
|
|
114
143
|
payload: { success: false, error: 'Script errored' },
|
|
115
144
|
}));
|
|
116
145
|
expect(msg).toEqual({
|
|
117
146
|
type: 'scriptComplete',
|
|
147
|
+
sessionId: 'test-session',
|
|
118
148
|
payload: { success: false, error: 'Script errored' },
|
|
119
149
|
});
|
|
120
150
|
});
|
|
121
151
|
it('returns null if success is not boolean', () => {
|
|
122
152
|
const msg = decodePluginMessage(JSON.stringify({
|
|
123
153
|
type: 'scriptComplete',
|
|
154
|
+
sessionId: 'test-session',
|
|
124
155
|
payload: { success: 'yes' },
|
|
125
156
|
}));
|
|
126
157
|
expect(msg).toBeNull();
|
|
127
158
|
});
|
|
159
|
+
it('returns null for scriptComplete without top-level sessionId', () => {
|
|
160
|
+
const msg = decodePluginMessage(JSON.stringify({
|
|
161
|
+
type: 'scriptComplete',
|
|
162
|
+
payload: { success: true },
|
|
163
|
+
}));
|
|
164
|
+
expect(msg).toBeNull();
|
|
165
|
+
});
|
|
128
166
|
});
|
|
129
167
|
describe('malformed messages', () => {
|
|
130
168
|
it('returns null for invalid JSON', () => {
|
|
@@ -134,14 +172,18 @@ describe('decodePluginMessage', () => {
|
|
|
134
172
|
expect(decodePluginMessage('"just a string"')).toBeNull();
|
|
135
173
|
});
|
|
136
174
|
it('returns null for missing type', () => {
|
|
137
|
-
expect(decodePluginMessage(JSON.stringify({ payload: {} }))).toBeNull();
|
|
175
|
+
expect(decodePluginMessage(JSON.stringify({ sessionId: 's', payload: {} }))).toBeNull();
|
|
138
176
|
});
|
|
139
177
|
it('returns null for missing payload', () => {
|
|
140
|
-
expect(decodePluginMessage(JSON.stringify({ type: 'hello' }))).toBeNull();
|
|
178
|
+
expect(decodePluginMessage(JSON.stringify({ type: 'hello', sessionId: 's' }))).toBeNull();
|
|
179
|
+
});
|
|
180
|
+
it('returns null for missing sessionId', () => {
|
|
181
|
+
expect(decodePluginMessage(JSON.stringify({ type: 'hello', payload: { sessionId: 's' } }))).toBeNull();
|
|
141
182
|
});
|
|
142
183
|
it('returns null for unknown message type', () => {
|
|
143
184
|
expect(decodePluginMessage(JSON.stringify({
|
|
144
185
|
type: 'unknown',
|
|
186
|
+
sessionId: 'test',
|
|
145
187
|
payload: {},
|
|
146
188
|
}))).toBeNull();
|
|
147
189
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-socket-protocol.test.js","sourceRoot":"","sources":["../../../src/server/web-socket-protocol.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,IAAI,GAAG,aAAa,CAAC;YACzB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE;SAClC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE;SAClC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"web-socket-protocol.test.js","sourceRoot":"","sources":["../../../src/server/web-socket-protocol.test.ts"],"names":[],"mappings":"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"}
|