@quenty/datastore 13.26.1 → 13.27.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,17 @@
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
+ # [13.27.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/datastore@13.26.1...@quenty/datastore@13.27.0) (2026-01-06)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * Add more typing ([f32615e](https://github.com/Quenty/NevermoreEngine/commit/f32615ec9d846a1a4392a3b21a0f594e8d420b44))
12
+
13
+
14
+
15
+
16
+
6
17
  ## [13.26.1](https://github.com/Quenty/NevermoreEngine/compare/@quenty/datastore@13.26.0...@quenty/datastore@13.26.1) (2026-01-05)
7
18
 
8
19
  **Note:** Version bump only for package @quenty/datastore
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quenty/datastore",
3
- "version": "13.26.1",
3
+ "version": "13.27.0",
4
4
  "description": "Quenty's Datastore implementation for Roblox",
5
5
  "keywords": [
6
6
  "Roblox",
@@ -44,5 +44,5 @@
44
44
  "publishConfig": {
45
45
  "access": "public"
46
46
  },
47
- "gitHead": "5232cd2c58ca0dcdf591dd8ae78995211da2f3e2"
47
+ "gitHead": "540aa2a77acbb6c9c5967fe4417400a903df2c2c"
48
48
  }
@@ -314,7 +314,7 @@ function DataStore.PromiseViewUpToDate(self: DataStore): Promise.Promise<()>
314
314
  return promise
315
315
  end
316
316
 
317
- function DataStore._setupAutoSaving(self: DataStore)
317
+ function DataStore._setupAutoSaving(self: DataStore): ()
318
318
  local startTime = os.clock()
319
319
 
320
320
  self._maid:GiveTask(Rx.combineLatest({
@@ -364,7 +364,7 @@ function DataStore._setupAutoSaving(self: DataStore)
364
364
  end))
365
365
  end
366
366
 
367
- function DataStore._syncData(self: DataStore, doMergeNewData: boolean, doCloseSession: boolean?)
367
+ function DataStore._syncData(self: DataStore, doMergeNewData: boolean, doCloseSession: boolean?): Promise.Promise<()>
368
368
  if self:DidLoadFail() then
369
369
  warn("[DataStore] - Not syncing, failed to load")
370
370
  return Promise.rejected("Load not successful, not syncing")
@@ -18,16 +18,31 @@ local ServiceBag = require("ServiceBag")
18
18
  local GameDataStoreService = {}
19
19
  GameDataStoreService.ServiceName = "GameDataStoreService"
20
20
 
21
- function GameDataStoreService:Init(serviceBag: ServiceBag.ServiceBag)
22
- assert(not self._serviceBag, "Already initialized")
21
+ export type GameDataStoreService = typeof(setmetatable(
22
+ {} :: {
23
+ _serviceBag: ServiceBag.ServiceBag,
24
+ _maid: Maid.Maid,
25
+ _dataStorePromise: Promise.Promise<DataStore.DataStore>?,
26
+ _robloxDataStorePromise: Promise.Promise<any>?,
27
+ _bindToCloseService: any,
28
+ },
29
+ {} :: typeof({ __index = GameDataStoreService })
30
+ ))
31
+
32
+ function GameDataStoreService.Init(self: GameDataStoreService, serviceBag: ServiceBag.ServiceBag): ()
33
+ assert(not (self :: any)._serviceBag, "Already initialized")
23
34
  self._serviceBag = assert(serviceBag, "No serviceBag")
35
+ self._maid = Maid.new()
24
36
 
25
37
  self._bindToCloseService = self._serviceBag:GetService(require("BindToCloseService"))
26
-
27
- self._maid = Maid.new()
28
38
  end
29
39
 
30
- function GameDataStoreService:PromiseDataStore(): Promise.Promise<DataStore>
40
+ --[=[
41
+ Promises a DataStore for the current game that is synchronized every 5 seconds.
42
+
43
+ @return Promise<DataStore>
44
+ ]=]
45
+ function GameDataStoreService.PromiseDataStore(self: GameDataStoreService): Promise.Promise<DataStore>
31
46
  if self._dataStorePromise then
32
47
  return self._dataStorePromise
33
48
  end
@@ -48,11 +63,12 @@ function GameDataStoreService:PromiseDataStore(): Promise.Promise<DataStore>
48
63
 
49
64
  return dataStore
50
65
  end)
66
+ assert(self._dataStorePromise, "Typechecking assertion")
51
67
 
52
68
  return self._dataStorePromise
53
69
  end
54
70
 
55
- function GameDataStoreService:_promiseRobloxDataStore(): Promise.Promise<any>
71
+ function GameDataStoreService._promiseRobloxDataStore(self: GameDataStoreService): Promise.Promise<any>
56
72
  if self._robloxDataStorePromise then
57
73
  return self._robloxDataStorePromise
58
74
  end
@@ -60,14 +76,16 @@ function GameDataStoreService:_promiseRobloxDataStore(): Promise.Promise<any>
60
76
  self._robloxDataStorePromise =
61
77
  self._maid:GivePromise(DataStorePromises.promiseDataStore("GameDataStore", "Version1"))
62
78
 
79
+ assert(self._robloxDataStorePromise, "Typechecking assertion")
80
+
63
81
  return self._robloxDataStorePromise
64
82
  end
65
83
 
66
- function GameDataStoreService:_getKey(): string
84
+ function GameDataStoreService._getKey(_self: GameDataStoreService): string
67
85
  return "version1"
68
86
  end
69
87
 
70
- function GameDataStoreService:Destroy()
88
+ function GameDataStoreService.Destroy(self: GameDataStoreService)
71
89
  self._maid:DoCleaning()
72
90
  end
73
91
 
@@ -9,4 +9,6 @@ local require = require(script.Parent.loader).load(script)
9
9
 
10
10
  local Symbol = require("Symbol")
11
11
 
12
- return Symbol.named("dataStoreDeleteToken")
12
+ export type DataStoreDeleteToken = Symbol.Symbol
13
+
14
+ return Symbol.named("dataStoreDeleteToken") :: DataStoreDeleteToken
@@ -111,8 +111,12 @@ end
111
111
  @param key string
112
112
  @param value any
113
113
  ]=]
114
- function DataStoreStage.Store(self: DataStoreStage, key: string, value: any)
115
- assert(type(key) == "string", "Bad key")
114
+ function DataStoreStage.Store(
115
+ self: DataStoreStage,
116
+ key: DataStoreStageKey,
117
+ value: any | DataStoreDeleteToken.DataStoreDeleteToken
118
+ ): ()
119
+ assert(type(key) == "string" or type(key) == "number", "Bad key")
116
120
 
117
121
  if value == nil then
118
122
  value = DataStoreDeleteToken
@@ -133,7 +137,7 @@ end
133
137
  end)
134
138
  ```
135
139
 
136
- @param key string | number
140
+ @param key DataStoreStageKey
137
141
  @param defaultValue T?
138
142
  @return Promise<T>
139
143
  ]=]
@@ -166,7 +170,7 @@ end
166
170
  @param defaultValue any
167
171
  @return Promise<any>
168
172
  ]=]
169
- function DataStoreStage.LoadAll(self: DataStoreStage, defaultValue)
173
+ function DataStoreStage.LoadAll<T>(self: DataStoreStage, defaultValue: T?): Promise.Promise<T?>
170
174
  return self:PromiseViewUpToDate():Then(function()
171
175
  if self._viewSnapshot == nil then
172
176
  return defaultValue
@@ -187,10 +191,10 @@ end
187
191
  saveslot:Store("Money", 0)
188
192
  ```
189
193
 
190
- @param key string | number
194
+ @param key DataStoreStageKey
191
195
  @return DataStoreStage
192
196
  ]=]
193
- function DataStoreStage.GetSubStore(self: DataStoreStage, key: DataStoreStageKey)
197
+ function DataStoreStage.GetSubStore(self: DataStoreStage, key: DataStoreStageKey): DataStoreStage
194
198
  assert(type(key) == "string" or type(key) == "number", "Bad key")
195
199
 
196
200
  if self._stores[key] then
@@ -243,10 +247,10 @@ end
243
247
  --[=[
244
248
  Explicitely deletes data at the key
245
249
 
246
- @param key string | number
250
+ @param key DataStoreStageKey
247
251
  ]=]
248
- function DataStoreStage.Delete(self: DataStoreStage, key: string)
249
- assert(type(key) == "string", "Bad key")
252
+ function DataStoreStage.Delete(self: DataStoreStage, key: DataStoreStageKey): ()
253
+ assert(type(key) == "string" or type(key) == "number", "Bad key")
250
254
 
251
255
  self:_storeAtKey(key, DataStoreDeleteToken)
252
256
  end
@@ -254,7 +258,7 @@ end
254
258
  --[=[
255
259
  Queues up a wipe of all values. This will completely set the data to nil.
256
260
  ]=]
257
- function DataStoreStage.Wipe(self: DataStoreStage)
261
+ function DataStoreStage.Wipe(self: DataStoreStage): ()
258
262
  self:Overwrite(DataStoreDeleteToken)
259
263
  end
260
264
 
@@ -263,12 +267,16 @@ end
263
267
 
264
268
  If no key is passed than it will observe the whole view snapshot
265
269
 
266
- @param key string | number?
270
+ @param key DataStoreStageKey?
267
271
  @param defaultValue T?
268
272
  @return Observable<T>
269
273
  ]=]
270
- function DataStoreStage.Observe(self: DataStoreStage, key, defaultValue)
271
- assert(type(key) == "string" or type(key) == "number" or key == nil, "Bad key")
274
+ function DataStoreStage.Observe<T>(
275
+ self: DataStoreStage,
276
+ key: DataStoreStageKey?,
277
+ defaultValue: T?
278
+ ): Observable.Observable<T>
279
+ assert(type(key) == "string" or type(key) == "number", "Bad key")
272
280
 
273
281
  if key == nil then
274
282
  return Observable.new(function(sub)
@@ -293,7 +301,7 @@ function DataStoreStage.Observe(self: DataStoreStage, key, defaultValue)
293
301
  end)
294
302
 
295
303
  return maid
296
- end)
304
+ end) :: any
297
305
  end
298
306
 
299
307
  return Observable.new(function(sub)
@@ -315,16 +323,16 @@ function DataStoreStage.Observe(self: DataStoreStage, key, defaultValue)
315
323
  end)
316
324
 
317
325
  return maid
318
- end)
326
+ end) :: any
319
327
  end
320
328
 
321
329
  --[=[
322
330
  Adds a callback to be called before save. This may return a promise.
323
331
 
324
332
  @param callback function -- May return a promise
325
- @return function -- Call to remove
333
+ @return () -> () -- Call to remove
326
334
  ]=]
327
- function DataStoreStage.AddSavingCallback(self: DataStoreStage, callback: DataStoreCallback?)
335
+ function DataStoreStage.AddSavingCallback(self: DataStoreStage, callback: DataStoreCallback?): () -> ()
328
336
  assert(type(callback) == "function", "Bad callback")
329
337
 
330
338
  table.insert(self._savingCallbacks, callback)
@@ -340,7 +348,7 @@ end
340
348
  Removes a saving callback from the data store stage
341
349
  @param callback function
342
350
  ]=]
343
- function DataStoreStage.RemoveSavingCallback(self: DataStoreStage, callback: DataStoreCallback?)
351
+ function DataStoreStage.RemoveSavingCallback(self: DataStoreStage, callback: DataStoreCallback?): ()
344
352
  assert(type(callback) == "function", "Bad callback")
345
353
 
346
354
  local index = table.find(self._savingCallbacks, callback)
@@ -434,7 +442,7 @@ end
434
442
 
435
443
  @param parentWriter DataStoreWriter
436
444
  ]=]
437
- function DataStoreStage.MarkDataAsSaved(self: DataStoreStage, parentWriter: DataStoreWriter.DataStoreWriter)
445
+ function DataStoreStage.MarkDataAsSaved(self: DataStoreStage, parentWriter: DataStoreWriter.DataStoreWriter): ()
438
446
  -- Update all children first
439
447
  for key, subwriter in pairs(parentWriter:GetSubWritersMap()) do
440
448
  local store = self._stores[key]
@@ -504,7 +512,7 @@ end
504
512
 
505
513
  @return Promise
506
514
  ]=]
507
- function DataStoreStage.PromiseViewUpToDate(self: DataStoreStage)
515
+ function DataStoreStage.PromiseViewUpToDate(self: DataStoreStage): Promise.Promise<()>
508
516
  if not self._loadParent then
509
517
  error("[DataStoreStage.Load] - Failed to load, no loadParent!")
510
518
  end
@@ -525,7 +533,7 @@ end
525
533
 
526
534
  @param data any
527
535
  ]=]
528
- function DataStoreStage.Overwrite(self: DataStoreStage, data)
536
+ function DataStoreStage.Overwrite(self: DataStoreStage, data: any | DataStoreDeleteToken.DataStoreDeleteToken): ()
529
537
  -- Ensure that we at least start loading (and thus the autosave loop) for write
530
538
  self:PromiseViewUpToDate()
531
539
 
@@ -578,7 +586,7 @@ end
578
586
 
579
587
  @param data any
580
588
  ]=]
581
- function DataStoreStage.OverwriteMerge(self: DataStoreStage, data)
589
+ function DataStoreStage.OverwriteMerge(self: DataStoreStage, data: any): ()
582
590
  -- Ensure that we at least start loading (and thus the autosave loop) for write
583
591
  self:PromiseViewUpToDate()
584
592
 
@@ -775,7 +783,7 @@ end
775
783
  function DataStoreStage._updateStoresAndComputeBaseDataSnapshotValueFromDiffSnapshot(
776
784
  self: DataStoreStage,
777
785
  key: DataStoreStageKey,
778
- value
786
+ value: any | DataStoreDeleteToken.DataStoreDeleteToken
779
787
  )
780
788
  assert(type(key) == "string" or type(key) == "number", "Bad key")
781
789
 
@@ -95,7 +95,7 @@ end
95
95
 
96
96
  --[=[
97
97
  Adds a recursive child writer to use at the key `name`
98
- @param name string | number
98
+ @param name DataStoreStageKey
99
99
  @param writer DataStoreWriter
100
100
  ]=]
101
101
  function DataStoreWriter.AddSubWriter(self: DataStoreWriter, name: DataStoreStageKey, writer: DataStoreWriter)
@@ -109,7 +109,7 @@ end
109
109
  --[=[
110
110
  Gets a sub writer
111
111
 
112
- @param name string | number
112
+ @param name DataStoreStageKey
113
113
  @return DataStoreWriter
114
114
  ]=]
115
115
  function DataStoreWriter.GetWriter(self: DataStoreWriter, name: DataStoreStageKey): DataStoreWriter?
@@ -25,6 +25,8 @@ export type PlayerDataStoreService = typeof(setmetatable(
25
25
  _dataStoreName: string,
26
26
  _dataStoreScope: string,
27
27
  _dataStoreManagerPromise: Promise.Promise<PlayerDataStoreManager.PlayerDataStoreManager>,
28
+ _bindToCloseService: any,
29
+ _promiseStarted: Promise.Promise<()>,
28
30
  },
29
31
  {} :: typeof({ __index = PlayerDataStoreService })
30
32
  ))
@@ -33,7 +35,7 @@ export type PlayerDataStoreService = typeof(setmetatable(
33
35
  Initializes the PlayerDataStoreService. Should be done via [ServiceBag.Init].
34
36
  @param serviceBag ServiceBag
35
37
  ]=]
36
- function PlayerDataStoreService:Init(serviceBag: ServiceBag.ServiceBag)
38
+ function PlayerDataStoreService.Init(self: PlayerDataStoreService, serviceBag: ServiceBag.ServiceBag): ()
37
39
  self._serviceBag = assert(serviceBag, "No serviceBag")
38
40
  self._maid = Maid.new()
39
41
 
@@ -49,7 +51,7 @@ end
49
51
  --[=[
50
52
  Initializes the datastore service for players. Should be done via [ServiceBag.Start].
51
53
  ]=]
52
- function PlayerDataStoreService:Start()
54
+ function PlayerDataStoreService.Start(self: PlayerDataStoreService): ()
53
55
  -- Give time for configuration
54
56
  self._promiseStarted:Resolve()
55
57
  end
@@ -63,7 +65,7 @@ end
63
65
 
64
66
  @param dataStoreName string
65
67
  ]=]
66
- function PlayerDataStoreService:SetDataStoreName(dataStoreName: string): ()
68
+ function PlayerDataStoreService.SetDataStoreName(self: PlayerDataStoreService, dataStoreName: string): ()
67
69
  assert(type(dataStoreName) == "string", "Bad dataStoreName")
68
70
  assert(self._promiseStarted, "Not initialized")
69
71
  assert(self._promiseStarted:IsPending(), "Already started, cannot configure")
@@ -80,7 +82,7 @@ end
80
82
 
81
83
  @param dataStoreScope string
82
84
  ]=]
83
- function PlayerDataStoreService:SetDataStoreScope(dataStoreScope: string): ()
85
+ function PlayerDataStoreService.SetDataStoreScope(self: PlayerDataStoreService, dataStoreScope: string): ()
84
86
  assert(type(dataStoreScope) == "string", "Bad dataStoreScope")
85
87
  assert(self._promiseStarted, "Not initialized")
86
88
  assert(self._promiseStarted:IsPending(), "Already started, cannot configure")
@@ -93,7 +95,10 @@ end
93
95
  @param player Player
94
96
  @return Promise<DataStore>
95
97
  ]=]
96
- function PlayerDataStoreService:PromiseDataStore(player: Player): Promise.Promise<DataStore.DataStore>
98
+ function PlayerDataStoreService.PromiseDataStore(
99
+ self: PlayerDataStoreService,
100
+ player: Player
101
+ ): Promise.Promise<DataStore.DataStore>
97
102
  return self:PromiseManager():Then(function(manager)
98
103
  return manager:GetDataStore(player)
99
104
  end)
@@ -104,7 +109,10 @@ end
104
109
  @param callback function -- May return a promise
105
110
  @return Promise
106
111
  ]=]
107
- function PlayerDataStoreService:PromiseAddRemovingCallback(callback)
112
+ function PlayerDataStoreService.PromiseAddRemovingCallback(
113
+ self: PlayerDataStoreService,
114
+ callback: () -> Promise.Promise<any>?
115
+ ): Promise.Promise<()>
108
116
  return self:PromiseManager():Then(function(manager)
109
117
  manager:AddRemovingCallback(callback)
110
118
  end)
@@ -114,7 +122,9 @@ end
114
122
  Retrieves the manager
115
123
  @return Promise<PlayerDataStoreManager>
116
124
  ]=]
117
- function PlayerDataStoreService:PromiseManager(): Promise.Promise<PlayerDataStoreManager.PlayerDataStoreManager>
125
+ function PlayerDataStoreService.PromiseManager(
126
+ self: PlayerDataStoreService
127
+ ): Promise.Promise<PlayerDataStoreManager.PlayerDataStoreManager>
118
128
  if self._dataStoreManagerPromise then
119
129
  return self._dataStoreManagerPromise
120
130
  end
@@ -135,11 +145,12 @@ function PlayerDataStoreService:PromiseManager(): Promise.Promise<PlayerDataStor
135
145
 
136
146
  return manager
137
147
  end)
148
+ assert(self._dataStoreManagerPromise, "Typechecking assertion")
138
149
 
139
150
  return self._dataStoreManagerPromise
140
151
  end
141
152
 
142
- function PlayerDataStoreService:Destroy()
153
+ function PlayerDataStoreService.Destroy(self: PlayerDataStoreService): ()
143
154
  self._maid:DoCleaning()
144
155
  end
145
156
 
@@ -17,23 +17,41 @@ local ServiceBag = require("ServiceBag")
17
17
  local PrivateServerDataStoreService = {}
18
18
  PrivateServerDataStoreService.ServiceName = "PrivateServerDataStoreService"
19
19
 
20
- function PrivateServerDataStoreService:Init(serviceBag: ServiceBag.ServiceBag)
21
- assert(not self._serviceBag, "Already initialized")
20
+ export type PrivateServerDataStoreService = typeof(setmetatable(
21
+ {} :: {
22
+ _serviceBag: ServiceBag.ServiceBag,
23
+ _maid: Maid.Maid,
24
+ _dataStorePromise: Promise.Promise<DataStore.DataStore>?,
25
+ _robloxDataStorePromise: Promise.Promise<any>?,
26
+ _bindToCloseService: any,
27
+ _customKey: string?,
28
+ },
29
+ {} :: typeof({ __index = PrivateServerDataStoreService })
30
+ ))
31
+
32
+ function PrivateServerDataStoreService.Init(self: PrivateServerDataStoreService, serviceBag: ServiceBag.ServiceBag): ()
33
+ assert(not (self :: any)._serviceBag, "Already initialized")
22
34
  self._serviceBag = assert(serviceBag, "No serviceBag")
35
+ self._maid = Maid.new()
23
36
 
24
37
  self._bindToCloseService = self._serviceBag:GetService(require("BindToCloseService"))
25
-
26
- self._maid = Maid.new()
27
38
  end
28
39
 
29
- function PrivateServerDataStoreService:PromiseDataStore(): Promise.Promise<DataStore.DataStore>
40
+ --[=[
41
+ Promises a DataStore for the current private server. If this is not a private server, it returns a datastore
42
+ that is keyed towards "main".
43
+
44
+ @return Promise<DataStore>
45
+ ]=]
46
+ function PrivateServerDataStoreService.PromiseDataStore(
47
+ self: PrivateServerDataStoreService
48
+ ): Promise.Promise<DataStore.DataStore>
30
49
  if self._dataStorePromise then
31
50
  return self._dataStorePromise
32
51
  end
33
52
 
34
53
  self._dataStorePromise = self:_promiseRobloxDataStore():Then(function(robloxDataStore)
35
- local dataStore = DataStore.new(robloxDataStore, self:_getKey())
36
- self._maid:GiveTask(dataStore)
54
+ local dataStore = self._maid:Add(DataStore.new(robloxDataStore, self:_getKey()))
37
55
 
38
56
  if game.PrivateServerOwnerId ~= 0 then
39
57
  dataStore:Store("LastPrivateServerOwnerId", game.PrivateServerOwnerId)
@@ -45,11 +63,12 @@ function PrivateServerDataStoreService:PromiseDataStore(): Promise.Promise<DataS
45
63
 
46
64
  return dataStore
47
65
  end)
66
+ assert(self._dataStorePromise, "Typechecking assertion")
48
67
 
49
68
  return self._dataStorePromise
50
69
  end
51
70
 
52
- function PrivateServerDataStoreService:SetCustomKey(customKey: string)
71
+ function PrivateServerDataStoreService.SetCustomKey(self: PrivateServerDataStoreService, customKey: string): ()
53
72
  assert(
54
73
  self._dataStorePromise == nil,
55
74
  "[PrivateServerDataStoreService] - Already got datastore, cannot set custom key"
@@ -58,7 +77,9 @@ function PrivateServerDataStoreService:SetCustomKey(customKey: string)
58
77
  self._customKey = customKey
59
78
  end
60
79
 
61
- function PrivateServerDataStoreService:_promiseRobloxDataStore(): Promise.Promise<any>
80
+ function PrivateServerDataStoreService._promiseRobloxDataStore(
81
+ self: PrivateServerDataStoreService
82
+ ): Promise.Promise<any>
62
83
  if self._robloxDataStorePromise then
63
84
  return self._robloxDataStorePromise
64
85
  end
@@ -66,11 +87,12 @@ function PrivateServerDataStoreService:_promiseRobloxDataStore(): Promise.Promis
66
87
  -- This could potentially
67
88
  self._robloxDataStorePromise =
68
89
  self._maid:GivePromise(DataStorePromises.promiseDataStore("PrivateServerDataStores", "Version1"))
90
+ assert(self._robloxDataStorePromise, "Typechecking assertion")
69
91
 
70
92
  return self._robloxDataStorePromise
71
93
  end
72
94
 
73
- function PrivateServerDataStoreService:_getKey(): string
95
+ function PrivateServerDataStoreService._getKey(self: PrivateServerDataStoreService): string
74
96
  if self._customKey then
75
97
  return self._customKey
76
98
  end
@@ -81,7 +103,7 @@ function PrivateServerDataStoreService:_getKey(): string
81
103
  end
82
104
  end
83
105
 
84
- function PrivateServerDataStoreService:Destroy(): ()
106
+ function PrivateServerDataStoreService.Destroy(self: PrivateServerDataStoreService): ()
85
107
  self._maid:DoCleaning()
86
108
  end
87
109