@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 +11 -0
- package/package.json +2 -2
- package/src/Server/DataStore.lua +2 -2
- package/src/Server/GameDataStoreService.lua +26 -8
- package/src/Server/Modules/DataStoreDeleteToken.lua +3 -1
- package/src/Server/Modules/DataStoreStage.lua +31 -23
- package/src/Server/Modules/DataStoreWriter.lua +2 -2
- package/src/Server/PlayerDataStoreService.lua +19 -8
- package/src/Server/PrivateServerDataStoreService.lua +33 -11
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.
|
|
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": "
|
|
47
|
+
"gitHead": "540aa2a77acbb6c9c5967fe4417400a903df2c2c"
|
|
48
48
|
}
|
package/src/Server/DataStore.lua
CHANGED
|
@@ -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
|
-
|
|
22
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
84
|
+
function GameDataStoreService._getKey(_self: GameDataStoreService): string
|
|
67
85
|
return "version1"
|
|
68
86
|
end
|
|
69
87
|
|
|
70
|
-
function GameDataStoreService
|
|
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
|
-
|
|
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(
|
|
115
|
-
|
|
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
|
|
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
|
|
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
|
|
250
|
+
@param key DataStoreStageKey
|
|
247
251
|
]=]
|
|
248
|
-
function DataStoreStage.Delete(self: DataStoreStage, key:
|
|
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
|
|
270
|
+
@param key DataStoreStageKey?
|
|
267
271
|
@param defaultValue T?
|
|
268
272
|
@return Observable<T>
|
|
269
273
|
]=]
|
|
270
|
-
function DataStoreStage.Observe(
|
|
271
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
106
|
+
function PrivateServerDataStoreService.Destroy(self: PrivateServerDataStoreService): ()
|
|
85
107
|
self._maid:DoCleaning()
|
|
86
108
|
end
|
|
87
109
|
|