@@ -5,13 +5,21 @@ import {
5
5
decryptData ,
6
6
deriveEncryptionKey ,
7
7
EncryptedData ,
8
+ getEncryptionSalt ,
8
9
PersistenceManager ,
9
10
PersistentData ,
10
11
} from "../persistenceManager" ;
11
12
import { ServiceManager } from "../serviceManager" ;
12
13
import { ServiceProvider } from "../serviceProvider" ;
13
14
import { emptySuccess , error } from "../utils/result" ;
14
- import { MockNodeCG , testBundle , testInstance , testService , testServiceInstance } from "./mocks" ;
15
+ import {
16
+ MockNodeCG ,
17
+ testBundle ,
18
+ testInstance ,
19
+ testService ,
20
+ testServiceInstance ,
21
+ websocketServerService ,
22
+ } from "./mocks" ;
15
23
16
24
describe ( "PersistenceManager" , ( ) => {
17
25
const validPassword = "myPassword" ;
@@ -23,6 +31,7 @@ describe("PersistenceManager", () => {
23
31
const nodecg = new MockNodeCG ( ) ;
24
32
const serviceManager = new ServiceManager ( nodecg ) ;
25
33
serviceManager . registerService ( testService ) ;
34
+ serviceManager . registerService ( websocketServerService ) ;
26
35
27
36
let bundleManager : BundleManager ;
28
37
let instanceManager : InstanceManager ;
@@ -262,6 +271,54 @@ describe("PersistenceManager", () => {
262
271
expect ( deps ?. [ 0 ] ) . toBeDefined ( ) ;
263
272
expect ( deps ?. [ 0 ] ?. serviceInstance ) . toBeUndefined ( ) ;
264
273
} ) ;
274
+
275
+ // Config migration
276
+
277
+ test ( "should be able to migrate nodecg-io <= 0.2 config to a newer nodecg-io >= 0.3 config" , async ( ) => {
278
+ // Old nodecg-io 0.2 config with the following values:
279
+ // password: 654321
280
+ // services:
281
+ // ws -> websocket-server
282
+ // port: 5678
283
+ // bundles:
284
+ // ws-server-test:
285
+ // websocket-server -> ws
286
+ const oldConfig : EncryptedData = {
287
+ cipherText :
288
+ "U2FsdGVkX19/ECpN7V/FUE4WQ3Fp5mb/0y06HHG6TVw7oRdQfMygbnfP2VtgJ7MVx/Uw7U5wI7jlwSNHN/3eG0rY0Du2E5jJbHr3OHl5OfgsZKWbGVoEzuCtEsLjSz1FeEf4C2VIvjWeJWTKBmSm+DVitNRwwM6Ex+f97gI0HbWjU9qVhBsw05RY9vA4/XpsucRdEh5Q6RIDnVn3Gj75OlB7IlsygCv2IzxnGqx4vr3k8J4kQo8DBhyOdxQtYCkHSpuM0d3cBOMAgySZWcw2EU5PN7F6wMmeR5Zko10LhNuMntSD+Zw6yZFeFPVDRM4OhVv8146zZX5+w3XJX2KZjQ==" ,
289
+ } ;
290
+ encryptedDataReplicant . value = oldConfig ;
291
+ bundleManager . registerServiceDependency ( "ws-server-test" , websocketServerService ) ;
292
+
293
+ // Invalid keys should also error with olds configs
294
+ const invalidResult = await persistenceManager . load ( invalidEncryptionKey ) ;
295
+ expect ( invalidResult . failed ) . toBe ( true ) ;
296
+
297
+ // Loading should just work and migrate the configuration
298
+ const password = "654321" ;
299
+ const salt = await getEncryptionSalt ( oldConfig , password ) ;
300
+ const encryptionKey = await deriveEncryptionKey ( password , salt ) ;
301
+ const correctPasswordResult = await persistenceManager . load ( encryptionKey ) ;
302
+ expect ( correctPasswordResult . failed ) . toBe ( false ) ;
303
+
304
+ // Config has been migrated: salt and iv are only present in nodecg-io >=0.3 configs
305
+ expect ( oldConfig . salt ) . toBeDefined ( ) ;
306
+ expect ( oldConfig . iv ) . toBeDefined ( ) ;
307
+
308
+ // Check instances and bundles for correct data
309
+ expect ( instanceManager . getServiceInstance ( "ws" ) ) . toBeDefined ( ) ;
310
+ expect ( instanceManager . getServiceInstance ( "ws" ) ?. config ) . toEqual ( {
311
+ port : 5678 ,
312
+ } ) ;
313
+
314
+ expect ( bundleManager . getBundleDependencies ( ) [ "ws-server-test" ] ) . toEqual ( [
315
+ {
316
+ serviceType : "websocket-server" ,
317
+ serviceInstance : "ws" ,
318
+ provider : new ServiceProvider ( ) ,
319
+ } ,
320
+ ] ) ;
321
+ } ) ;
265
322
} ) ;
266
323
267
324
describe ( "save" , ( ) => {
0 commit comments