@quenty/secrets 7.50.1 → 7.51.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 CHANGED
@@ -3,6 +3,20 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [7.51.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/secrets@7.50.2...@quenty/secrets@7.51.0) (2026-07-14)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **lint:** resolve selene unused-self and Rx shadowing from --!strict conversions ([3f4a085](https://github.com/Quenty/NevermoreEngine/commit/3f4a085911808146f10a2435efbe9e89dff8edff))
11
+
12
+ ### Features
13
+
14
+ - **secrets:** convert package to --!strict ([d0771a1](https://github.com/Quenty/NevermoreEngine/commit/d0771a1e22b964bb9b06a072e3d43ff5e1443923))
15
+
16
+ ## [7.50.2](https://github.com/Quenty/NevermoreEngine/compare/@quenty/secrets@7.50.1...@quenty/secrets@7.50.2) (2026-06-03)
17
+
18
+ **Note:** Version bump only for package @quenty/secrets
19
+
6
20
  ## [7.50.1](https://github.com/Quenty/NevermoreEngine/compare/@quenty/secrets@7.50.0...@quenty/secrets@7.50.1) (2026-05-30)
7
21
 
8
22
  **Note:** Version bump only for package @quenty/secrets
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quenty/secrets",
3
- "version": "7.50.1",
3
+ "version": "7.51.0",
4
4
  "description": "Secrets storage system and API surface",
5
5
  "keywords": [
6
6
  "Roblox",
@@ -28,13 +28,13 @@
28
28
  "Quenty"
29
29
  ],
30
30
  "dependencies": {
31
- "@quenty/cmdrservice": "13.45.1",
32
- "@quenty/datastore": "13.39.1",
33
- "@quenty/ellipticcurvecryptography": "1.12.0",
31
+ "@quenty/cmdrservice": "13.46.0",
32
+ "@quenty/datastore": "13.40.0",
33
+ "@quenty/ellipticcurvecryptography": "1.13.0",
34
34
  "@quenty/loader": "10.11.0",
35
35
  "@quenty/maid": "3.9.0",
36
36
  "@quenty/nevermore-test-runner": "1.4.0",
37
- "@quenty/permissionprovider": "14.38.1",
37
+ "@quenty/permissionprovider": "14.39.0",
38
38
  "@quenty/promise": "10.18.1",
39
39
  "@quenty/remotefunctionutils": "10.18.1",
40
40
  "@quenty/remoting": "12.32.1",
@@ -46,5 +46,5 @@
46
46
  "publishConfig": {
47
47
  "access": "public"
48
48
  },
49
- "gitHead": "598b2b62b36bdcbdbbd56f7db10c399831cc6eba"
49
+ "gitHead": "13f0162f4971a77378e55e9b7236aea94f0dd3a8"
50
50
  }
@@ -1,4 +1,4 @@
1
- --!nonstrict
1
+ --!strict
2
2
  --[=[
3
3
  @class SecretsServiceClient
4
4
  ]=]
@@ -16,8 +16,19 @@ local ServiceBag = require("ServiceBag")
16
16
  local SecretsServiceClient = {}
17
17
  SecretsServiceClient.ServiceName = "SecretsServiceClient"
18
18
 
19
- function SecretsServiceClient:Init(serviceBag: ServiceBag.ServiceBag)
20
- assert(not self._serviceBag, "Already initialized")
19
+ export type SecretsServiceClient = typeof(setmetatable(
20
+ {} :: {
21
+ _serviceBag: ServiceBag.ServiceBag,
22
+ _maid: Maid.Maid,
23
+ _cmdrService: any,
24
+ _permissionsService: any,
25
+ _remoteFunctionPromise: Promise.Promise<any>?,
26
+ },
27
+ {} :: typeof({ __index = SecretsServiceClient })
28
+ ))
29
+
30
+ function SecretsServiceClient.Init(self: SecretsServiceClient, serviceBag: ServiceBag.ServiceBag): ()
31
+ assert(not (self :: any)._serviceBag, "Already initialized")
21
32
  self._serviceBag = assert(serviceBag, "No serviceBag")
22
33
  self._maid = Maid.new()
23
34
 
@@ -26,46 +37,49 @@ function SecretsServiceClient:Init(serviceBag: ServiceBag.ServiceBag)
26
37
  self._permissionsService = self._serviceBag:GetService(require("PermissionServiceClient"))
27
38
  end
28
39
 
29
- function SecretsServiceClient:Start()
40
+ function SecretsServiceClient.Start(self: SecretsServiceClient): ()
30
41
  self:_registerCmdrTypes()
31
42
  end
32
43
 
33
- function SecretsServiceClient:PromiseSecretKeyNamesList(): Promise.Promise<{ string }>
34
- return self:_promiseRemoteFunction()
35
- :Then(function(remoteFunction)
36
- return self._maid:GivePromise(
37
- RemoteFunctionUtils.promiseInvokeServer(
38
- remoteFunction,
39
- SecretsServiceConstants.REQUEST_SECRET_KEY_NAMES_LIST
44
+ function SecretsServiceClient.PromiseSecretKeyNamesList(self: SecretsServiceClient): Promise.Promise<{ string }>
45
+ return (
46
+ self:_promiseRemoteFunction()
47
+ :Then(function(remoteFunction)
48
+ return self._maid:GivePromise(
49
+ RemoteFunctionUtils.promiseInvokeServer(
50
+ remoteFunction,
51
+ SecretsServiceConstants.REQUEST_SECRET_KEY_NAMES_LIST
52
+ )
40
53
  )
41
- )
42
- end)
43
- :Then(function(ok, list)
44
- if not ok then
45
- return Promise.rejected(list or "Failed to get list")
46
- else
47
- return Promise.resolved(list)
48
- end
49
- end)
54
+ end)
55
+ :Then(function(ok, list)
56
+ if not ok then
57
+ return Promise.rejected(list or "Failed to get list")
58
+ else
59
+ return Promise.resolved(list)
60
+ end
61
+ end) :: any
62
+ ) :: Promise.Promise<{ string }>
50
63
  end
51
64
 
52
- function SecretsServiceClient:_registerCmdrTypes()
65
+ function SecretsServiceClient._registerCmdrTypes(self: SecretsServiceClient): ()
53
66
  self._maid:GivePromise(self._cmdrService:PromiseCmdr()):Then(function(cmdr)
54
67
  SecretsCmdrTypeUtils.registerSecretKeyTypes(cmdr, self)
55
68
  end)
56
69
  end
57
70
 
58
- function SecretsServiceClient:_promiseRemoteFunction()
71
+ function SecretsServiceClient._promiseRemoteFunction(self: SecretsServiceClient): Promise.Promise<any>
59
72
  if self._remoteFunctionPromise then
60
73
  return self._remoteFunctionPromise
61
74
  end
62
75
 
63
- self._remoteFunctionPromise =
76
+ local remoteFunctionPromise =
64
77
  self._maid:GivePromise(PromiseGetRemoteFunction(SecretsServiceConstants.REMOTE_FUNCTION_NAME))
65
- return self._remoteFunctionPromise
78
+ self._remoteFunctionPromise = remoteFunctionPromise
79
+ return remoteFunctionPromise
66
80
  end
67
81
 
68
- function SecretsServiceClient:Destroy()
82
+ function SecretsServiceClient.Destroy(self: SecretsServiceClient): ()
69
83
  self._maid:DoCleaning()
70
84
  end
71
85
 
@@ -1,4 +1,4 @@
1
- --!nonstrict
1
+ --!strict
2
2
  --[=[
3
3
  @class SecretsCommandService
4
4
  ]=]
@@ -12,8 +12,18 @@ local ServiceBag = require("ServiceBag")
12
12
  local SecretsCommandService = {}
13
13
  SecretsCommandService.ServiceName = "SecretsCommandService"
14
14
 
15
- function SecretsCommandService:Init(serviceBag: ServiceBag.ServiceBag)
16
- assert(not self._serviceBag, "Already initialized")
15
+ export type SecretsCommandService = typeof(setmetatable(
16
+ {} :: {
17
+ _serviceBag: ServiceBag.ServiceBag,
18
+ _maid: Maid.Maid,
19
+ _cmdrService: any,
20
+ _secretsService: any,
21
+ },
22
+ {} :: typeof({ __index = SecretsCommandService })
23
+ ))
24
+
25
+ function SecretsCommandService.Init(self: SecretsCommandService, serviceBag: ServiceBag.ServiceBag): ()
26
+ assert(not (self :: any)._serviceBag, "Already initialized")
17
27
  self._serviceBag = assert(serviceBag, "No serviceBag")
18
28
  self._maid = Maid.new()
19
29
 
@@ -21,11 +31,11 @@ function SecretsCommandService:Init(serviceBag: ServiceBag.ServiceBag)
21
31
  self._secretsService = self._serviceBag:GetService((require :: any)("SecretsService"))
22
32
  end
23
33
 
24
- function SecretsCommandService:Start()
34
+ function SecretsCommandService.Start(self: SecretsCommandService): ()
25
35
  self:_registerCommands()
26
36
  end
27
37
 
28
- function SecretsCommandService:_registerCommands()
38
+ function SecretsCommandService._registerCommands(self: SecretsCommandService): ()
29
39
  self._maid:GivePromise(self._cmdrService:PromiseCmdr()):Then(function(cmdr)
30
40
  SecretsCmdrTypeUtils.registerSecretKeyTypes(cmdr, self._secretsService)
31
41
  end)
@@ -153,7 +163,7 @@ function SecretsCommandService:_registerCommands()
153
163
  end)
154
164
  end
155
165
 
156
- function SecretsCommandService:Destroy()
166
+ function SecretsCommandService.Destroy(self: SecretsCommandService): ()
157
167
  self._maid:DoCleaning()
158
168
  end
159
169
 
@@ -1,4 +1,4 @@
1
- --!nonstrict
1
+ --!strict
2
2
  --[=[
3
3
  @class SecretsService
4
4
  ]=]
@@ -18,8 +18,28 @@ local ServiceBag = require("ServiceBag")
18
18
  local SecretsService = {}
19
19
  SecretsService.ServiceName = "SecretsService"
20
20
 
21
- function SecretsService:Init(serviceBag: ServiceBag.ServiceBag)
22
- assert(not self._serviceBag, "Already initialized")
21
+ export type SecretsData = {
22
+ encrypted: { number },
23
+ signature: { number },
24
+ }
25
+
26
+ export type SecretsService = typeof(setmetatable(
27
+ {} :: {
28
+ _serviceBag: ServiceBag.ServiceBag,
29
+ _maid: Maid.Maid,
30
+ _gameDataStoreService: any,
31
+ _permissionsService: any,
32
+ _publicKey: any,
33
+ _privateKey: any,
34
+ _warningRequired: boolean,
35
+ _remoteFunction: RemoteFunction,
36
+ _substorePromise: any,
37
+ },
38
+ {} :: typeof({ __index = SecretsService })
39
+ ))
40
+
41
+ function SecretsService.Init(self: SecretsService, serviceBag: ServiceBag.ServiceBag): ()
42
+ assert(not (self :: any)._serviceBag, "Already initialized")
23
43
  self._serviceBag = assert(serviceBag, "No serviceBag")
24
44
  self._maid = Maid.new()
25
45
 
@@ -43,7 +63,7 @@ end
43
63
 
44
64
  @param seed number
45
65
  ]=]
46
- function SecretsService:SetPublicKeySeed(seed: number): ()
66
+ function SecretsService.SetPublicKeySeed(self: SecretsService, seed: number): ()
47
67
  assert(type(seed) == "number", "Bad seed")
48
68
 
49
69
  local private, public = EllipticCurveCryptography.keypair(seed or EllipticCurveCryptography.random.random())
@@ -55,7 +75,7 @@ end
55
75
  --[=[
56
76
  Starts the secret service. Should be done via [ServiceBag].
57
77
  ]=]
58
- function SecretsService:Start()
78
+ function SecretsService.Start(self: SecretsService): ()
59
79
  self._remoteFunction = GetRemoteFunction(SecretsServiceConstants.REMOTE_FUNCTION_NAME)
60
80
  self._remoteFunction.OnServerInvoke = function(...)
61
81
  return self:_handleServerInvoke(...)
@@ -68,7 +88,7 @@ end
68
88
  @param secretKey string
69
89
  @return Promise<string>
70
90
  ]=]
71
- function SecretsService:PromiseSecret(secretKey: string): Promise.Promise<string | Secret>
91
+ function SecretsService.PromiseSecret(self: SecretsService, secretKey: string): Promise.Promise<string | Secret>
72
92
  assert(type(secretKey) == "string", "Bad secretKey")
73
93
 
74
94
  local found
@@ -79,14 +99,14 @@ function SecretsService:PromiseSecret(secretKey: string): Promise.Promise<string
79
99
  return Promise.resolved(found)
80
100
  end
81
101
 
82
- return self:_promiseSubstore():Then(function(substore)
83
- return self._maid:GivePromise(substore:Load(secretKey)):Then(function(data)
102
+ return (self :: any):_promiseSubstore():Then(function(substore)
103
+ return (self._maid :: any):GivePromise(substore:Load(secretKey)):Then(function(data)
84
104
  if type(data) ~= "table" then
85
105
  return Promise.resolved(nil)
86
106
  else
87
107
  local ok, value = self:_decrypt(data)
88
108
  if ok then
89
- return value
109
+ return value :: any
90
110
  else
91
111
  return Promise.rejected(value or "Failed to decrypt result")
92
112
  end
@@ -100,9 +120,9 @@ end
100
120
 
101
121
  @return @return Promise<{string}>
102
122
  ]=]
103
- function SecretsService:PromiseAllSecrets(): Promise.Promise<{ string }>
104
- return self:_promiseSubstore():Then(function(substore)
105
- return self._maid:GivePromise(substore:LoadAll()):Then(function(secretsList)
123
+ function SecretsService.PromiseAllSecrets(self: SecretsService): Promise.Promise<{ string }>
124
+ return (self :: any):_promiseSubstore():Then(function(substore)
125
+ return (self._maid :: any):GivePromise(substore:LoadAll()):Then(function(secretsList)
106
126
  local secretMap = {}
107
127
 
108
128
  for key, secretData in secretsList do
@@ -125,13 +145,13 @@ end
125
145
  @param secretKey string
126
146
  @return Observable<string>
127
147
  ]=]
128
- function SecretsService:ObserveSecret(secretKey: string): Observable.Observable<string>
148
+ function SecretsService.ObserveSecret(self: SecretsService, secretKey: string): Observable.Observable<string>
129
149
  assert(type(secretKey) == "string", "Bad secretKey")
130
150
 
131
- return Observable.new(function(sub)
132
- local maid = Maid.new()
151
+ return Observable.new(function(sub: any)
152
+ local maid: any = Maid.new()
133
153
 
134
- maid:GivePromise(self:_promiseSubstore():Then(function(substore)
154
+ maid:GivePromise((self :: any):_promiseSubstore():Then(function(substore)
135
155
  maid:GivePromise(
136
156
  substore:Observe(secretKey):Subscribe(function(data)
137
157
  if type(data) ~= "table" then
@@ -153,7 +173,7 @@ function SecretsService:ObserveSecret(secretKey: string): Observable.Observable<
153
173
  end))
154
174
 
155
175
  return maid
156
- end)
176
+ end) :: any
157
177
  end
158
178
 
159
179
  --[=[
@@ -161,10 +181,10 @@ end
161
181
 
162
182
  @param secretKey string
163
183
  ]=]
164
- function SecretsService:DeleteSecret(secretKey: string): Promise.Promise<()>
184
+ function SecretsService.DeleteSecret(self: SecretsService, secretKey: string): Promise.Promise<()>
165
185
  assert(type(secretKey) == "string", "Bad secretKey")
166
186
 
167
- return self:_promiseSubstore():Then(function(substore)
187
+ return (self :: any):_promiseSubstore():Then(function(substore)
168
188
  substore:Delete(secretKey)
169
189
  end)
170
190
  end
@@ -175,20 +195,19 @@ end
175
195
  @param secretKey string
176
196
  @param value string
177
197
  ]=]
178
- function SecretsService:StoreSecret(secretKey: string, value: string): ()
198
+ function SecretsService.StoreSecret(self: SecretsService, secretKey: string, value: string): ()
179
199
  assert(type(secretKey) == "string", "Bad secretKey")
180
200
  assert(type(value) == "string", "Bad value")
181
201
 
182
- self:_warnAboutNoPublicKeyStoredInSourceCode()
183
-
184
- self:_promiseSubstore():Then(function(substore)
202
+ self:_warnAboutNoPublicKeyStoredInSourceCode();
203
+ (self :: any):_promiseSubstore():Then(function(substore)
185
204
  local encrypted = EllipticCurveCryptography.encrypt(value, self._privateKey)
186
205
  local signature = EllipticCurveCryptography.sign(self._privateKey, value)
187
206
 
188
207
  -- TODO: Encode byte array in more efficient structure for JSON
189
208
  local toStore = {
190
- encrypted = setmetatable(table.clone(encrypted), nil), -- remove metatable
191
- signature = setmetatable(table.clone(signature), nil), -- remove metatable
209
+ encrypted = setmetatable(table.clone(encrypted) :: any, nil), -- remove metatable
210
+ signature = setmetatable(table.clone(signature) :: any, nil), -- remove metatable
192
211
  }
193
212
 
194
213
  substore:Store(secretKey, toStore)
@@ -200,8 +219,8 @@ end
200
219
 
201
220
  @return Promise<()>
202
221
  ]=]
203
- function SecretsService:ClearAllSecrets(): Promise.Promise<()>
204
- return self:_promiseSubstore():Then(function(substore)
222
+ function SecretsService.ClearAllSecrets(self: SecretsService): Promise.Promise<()>
223
+ return (self :: any):_promiseSubstore():Then(function(substore)
205
224
  return substore:Wipe()
206
225
  end)
207
226
  end
@@ -211,20 +230,20 @@ end
211
230
 
212
231
  @return Promise<{ string }>
213
232
  ]=]
214
- function SecretsService:PromiseSecretKeyNamesList(): Promise.Promise<{ string }>
215
- return self:_promiseSubstore():Then(function(substore)
233
+ function SecretsService.PromiseSecretKeyNamesList(self: SecretsService): Promise.Promise<{ string }>
234
+ return (self :: any):_promiseSubstore():Then(function(substore)
216
235
  return substore:PromiseKeyList()
217
236
  end)
218
237
  end
219
238
 
220
- function SecretsService:_warnAboutNoPublicKeyStoredInSourceCode(): ()
239
+ function SecretsService._warnAboutNoPublicKeyStoredInSourceCode(self: SecretsService): ()
221
240
  if self._warningRequired then
222
241
  self._warningRequired = false
223
242
  warn(self:_getInstructions())
224
243
  end
225
244
  end
226
245
 
227
- function SecretsService:_getInstructions(): string
246
+ function SecretsService._getInstructions(_self: SecretsService): string
228
247
  local instructions =
229
248
  "[SecretsService.StoreSecret] - Security - Current private key seed is GameId, which is guessable."
230
249
  instructions = instructions .. "\n\tTIP: This is only applicable if we're storing API keys for use in here."
@@ -236,12 +255,7 @@ function SecretsService:_getInstructions(): string
236
255
  return instructions
237
256
  end
238
257
 
239
- export type SecretsData = {
240
- encrypted: { number },
241
- signature: { number },
242
- }
243
-
244
- function SecretsService:_decrypt(data: SecretsData): (boolean?, string)
258
+ function SecretsService._decrypt(self: SecretsService, data: SecretsData): (boolean?, string)
245
259
  assert(type(data) == "table", "Bad data")
246
260
  assert(data.encrypted ~= nil, "Bad data.encrypted")
247
261
  assert(data.signature ~= nil, "Bad data.signature")
@@ -259,15 +273,15 @@ function SecretsService:_decrypt(data: SecretsData): (boolean?, string)
259
273
  return true, tostring(decrypted)
260
274
  end
261
275
 
262
- function SecretsService:_handleServerInvoke(player: Player, request)
276
+ function SecretsService._handleServerInvoke(self: SecretsService, player: Player, request: any): any
263
277
  if request == SecretsServiceConstants.REQUEST_SECRET_KEY_NAMES_LIST then
264
- return self:_promiseHandleList(player):Yield()
278
+ return (self :: any):_promiseHandleList(player):Yield()
265
279
  else
266
280
  error(string.format("Bad request %q", tostring(request)))
267
281
  end
268
282
  end
269
283
 
270
- function SecretsService:_promiseHandleList(player: Player)
284
+ function SecretsService._promiseHandleList(self: SecretsService, player: Player): any
271
285
  return self._permissionsService
272
286
  :PromisePermissionProvider()
273
287
  :Then(function(provider)
@@ -282,7 +296,7 @@ function SecretsService:_promiseHandleList(player: Player)
282
296
  end)
283
297
  end
284
298
 
285
- function SecretsService:_promiseSubstore()
299
+ function SecretsService._promiseSubstore(self: SecretsService): any
286
300
  if self._substorePromise then
287
301
  return self._substorePromise
288
302
  end
@@ -296,7 +310,7 @@ function SecretsService:_promiseSubstore()
296
310
  return self._substorePromise
297
311
  end
298
312
 
299
- function SecretsService:Destroy()
313
+ function SecretsService.Destroy(self: SecretsService): ()
300
314
  self._maid:DoCleaning()
301
315
  end
302
316