@quenty/settings 11.9.0 → 11.11.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,25 @@
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
+ # [11.11.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/settings@11.10.0...@quenty/settings@11.11.0) (2024-10-04)
7
+
8
+
9
+ ### Performance Improvements
10
+
11
+ * Fix settings to use a cache which reduces memory usage by 10 MB approximately ([990d0a6](https://github.com/Quenty/NevermoreEngine/commit/990d0a678ad405740acd045f041c0bbd51eca660))
12
+
13
+
14
+
15
+
16
+
17
+ # [11.10.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/settings@11.9.0...@quenty/settings@11.10.0) (2024-09-25)
18
+
19
+ **Note:** Version bump only for package @quenty/settings
20
+
21
+
22
+
23
+
24
+
6
25
  # [11.9.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/settings@11.8.2...@quenty/settings@11.9.0) (2024-09-25)
7
26
 
8
27
  **Note:** Version bump only for package @quenty/settings
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quenty/settings",
3
- "version": "11.9.0",
3
+ "version": "11.11.0",
4
4
  "description": "Centralized player settings service",
5
5
  "keywords": [
6
6
  "Roblox",
@@ -25,35 +25,35 @@
25
25
  "Quenty"
26
26
  ],
27
27
  "dependencies": {
28
- "@quenty/attributeutils": "^14.6.0",
29
- "@quenty/baseobject": "^10.5.0",
30
- "@quenty/binder": "^14.7.0",
31
- "@quenty/cmdrservice": "^13.8.0",
32
- "@quenty/datastore": "^13.8.0",
33
- "@quenty/ducktype": "^5.5.0",
28
+ "@quenty/attributeutils": "^14.8.0",
29
+ "@quenty/baseobject": "^10.6.0",
30
+ "@quenty/binder": "^14.9.0",
31
+ "@quenty/cmdrservice": "^13.10.0",
32
+ "@quenty/datastore": "^13.10.0",
33
+ "@quenty/ducktype": "^5.6.0",
34
34
  "@quenty/enumutils": "^3.3.0",
35
- "@quenty/jsonutils": "^10.5.0",
36
- "@quenty/loader": "^10.5.0",
37
- "@quenty/maid": "^3.3.0",
38
- "@quenty/observablecollection": "^12.6.0",
39
- "@quenty/playerbinder": "^14.7.0",
40
- "@quenty/playerutils": "^8.6.0",
41
- "@quenty/remotefunctionutils": "^10.5.0",
42
- "@quenty/remoting": "^12.7.0",
43
- "@quenty/rx": "^13.6.0",
44
- "@quenty/rxbinderutils": "^14.7.0",
45
- "@quenty/servicebag": "^11.6.0",
46
- "@quenty/signal": "^7.5.0",
47
- "@quenty/statestack": "^14.7.0",
35
+ "@quenty/jsonutils": "^10.6.0",
36
+ "@quenty/loader": "^10.6.0",
37
+ "@quenty/maid": "^3.4.0",
38
+ "@quenty/observablecollection": "^12.8.0",
39
+ "@quenty/playerbinder": "^14.9.0",
40
+ "@quenty/playerutils": "^8.8.0",
41
+ "@quenty/remotefunctionutils": "^10.6.0",
42
+ "@quenty/remoting": "^12.9.0",
43
+ "@quenty/rx": "^13.8.0",
44
+ "@quenty/rxbinderutils": "^14.9.0",
45
+ "@quenty/servicebag": "^11.8.0",
46
+ "@quenty/signal": "^7.7.0",
47
+ "@quenty/statestack": "^14.9.0",
48
48
  "@quenty/string": "^3.3.0",
49
- "@quenty/symbol": "^3.1.0",
49
+ "@quenty/symbol": "^3.2.0",
50
50
  "@quenty/table": "^3.5.0",
51
- "@quenty/throttle": "^10.6.0",
52
- "@quenty/tie": "^10.8.0",
53
- "@quenty/valueobject": "^13.6.0"
51
+ "@quenty/throttle": "^10.7.0",
52
+ "@quenty/tie": "^10.10.0",
53
+ "@quenty/valueobject": "^13.8.0"
54
54
  },
55
55
  "publishConfig": {
56
56
  "access": "public"
57
57
  },
58
- "gitHead": "41715b15e2b48b2d22ff4f5277a8d4b7a0d32ef3"
58
+ "gitHead": "035abfa088c854a73e1c65b350267eaa17669646"
59
59
  }
@@ -10,8 +10,6 @@ local require = require(script.Parent.loader).load(script)
10
10
 
11
11
  local Players = game:GetService("Players")
12
12
 
13
- local PlayerSettingsUtils = require("PlayerSettingsUtils")
14
- local Rx = require("Rx")
15
13
  local Maid = require("Maid")
16
14
  local SettingsCmdrUtils = require("SettingsCmdrUtils")
17
15
 
@@ -31,8 +29,10 @@ function SettingsServiceClient:Init(serviceBag)
31
29
  self._serviceBag:GetService(require("CmdrServiceClient"))
32
30
 
33
31
  -- Internal
34
- self._serviceBag:GetService(require("SettingRegistryServiceShared")):RegisterSettingService(self)
35
- self._playerSettingsBinder = self._serviceBag:GetService(require("PlayerSettingsClient"))
32
+ self._settingsDataService = self._serviceBag:GetService(require("SettingsDataService"))
33
+
34
+ -- Binders
35
+ self._serviceBag:GetService(require("PlayerSettingsClient"))
36
36
  end
37
37
 
38
38
  function SettingsServiceClient:Start()
@@ -84,7 +84,7 @@ end
84
84
  function SettingsServiceClient:ObservePlayerSettings(player)
85
85
  assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
86
86
 
87
- return PlayerSettingsUtils.observePlayerSettings(self._playerSettingsBinder, player)
87
+ return self._settingsDataService:ObservePlayerSettings(player)
88
88
  end
89
89
 
90
90
  --[=[
@@ -96,7 +96,7 @@ end
96
96
  function SettingsServiceClient:ObservePlayerSettingsBrio(player)
97
97
  assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
98
98
 
99
- return PlayerSettingsUtils.observePlayerSettingsBrio(self._playerSettingsBinder, player)
99
+ return self._settingsDataService:ObservePlayerSettingsBrio(player)
100
100
  end
101
101
 
102
102
  --[=[
@@ -108,7 +108,7 @@ end
108
108
  function SettingsServiceClient:GetPlayerSettings(player)
109
109
  assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
110
110
 
111
- return PlayerSettingsUtils.getPlayerSettings(self._playerSettingsBinder, player)
111
+ return self._settingsDataService:GetPlayerSettings(player)
112
112
  end
113
113
 
114
114
  --[=[
@@ -121,11 +121,7 @@ end
121
121
  function SettingsServiceClient:PromisePlayerSettings(player, cancelToken)
122
122
  assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
123
123
 
124
- return Rx.toPromise(self:ObservePlayerSettings(player):Pipe({
125
- Rx.where(function(x)
126
- return x ~= nil
127
- end)
128
- }), cancelToken)
124
+ return self._settingsDataService:PromisePlayerSettings(player, cancelToken)
129
125
  end
130
126
 
131
127
 
@@ -11,7 +11,7 @@ local PlayerSettingsConstants = require("PlayerSettingsConstants")
11
11
  local PlayerSettingsInterface = require("PlayerSettingsInterface")
12
12
  local PlayerSettingsUtils = require("PlayerSettingsUtils")
13
13
  local Remoting = require("Remoting")
14
- local SettingRegistryServiceShared = require("SettingRegistryServiceShared")
14
+ local SettingsDataService = require("SettingsDataService")
15
15
 
16
16
  local PlayerSettings = setmetatable({}, PlayerSettingsBase)
17
17
  PlayerSettings.ClassName = "PlayerSettings"
@@ -21,11 +21,11 @@ function PlayerSettings.new(obj, serviceBag)
21
21
  local self = setmetatable(PlayerSettingsBase.new(obj, serviceBag), PlayerSettings)
22
22
 
23
23
  self._serviceBag = assert(serviceBag, "No serviceBag")
24
- self._settingRegistryServiceShared = self._serviceBag:GetService(SettingRegistryServiceShared)
24
+ self._settingsDataService = self._serviceBag:GetService(SettingsDataService)
25
25
 
26
26
  self:_setupRemoting()
27
27
 
28
- self._maid:GiveTask(self._settingRegistryServiceShared:ObserveRegisteredDefinitionsBrio():Subscribe(function(brio)
28
+ self._maid:GiveTask(self._settingsDataService:ObserveRegisteredDefinitionsBrio():Subscribe(function(brio)
29
29
  if brio:IsDead() then
30
30
  return
31
31
  end
@@ -4,8 +4,6 @@
4
4
 
5
5
  local require = require(script.Parent.loader).load(script)
6
6
 
7
- local PlayerSettingsUtils = require("PlayerSettingsUtils")
8
- local Rx = require("Rx")
9
7
  local Maid = require("Maid")
10
8
 
11
9
  local SettingsService = {}
@@ -20,40 +18,36 @@ function SettingsService:Init(serviceBag)
20
18
  self._serviceBag:GetService(require("PlayerDataStoreService"))
21
19
  self._serviceBag:GetService(require("SettingsCmdrService"))
22
20
 
23
-
24
21
  -- Internal
25
- self._playerSettingsBinder = self._serviceBag:GetService(require("PlayerSettings"))
26
- self._serviceBag:GetService(require("PlayerHasSettings"))
22
+ self._settingsDataService = self._serviceBag:GetService(require("SettingsDataService"))
27
23
 
28
- self._serviceBag:GetService(require("SettingRegistryServiceShared")):RegisterSettingService(self)
24
+ -- Binders
25
+ self._serviceBag:GetService(require("PlayerHasSettings"))
26
+ self._serviceBag:GetService(require("PlayerSettings"))
29
27
  end
30
28
 
31
29
  function SettingsService:ObservePlayerSettingsBrio(player)
32
30
  assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
33
31
 
34
- return PlayerSettingsUtils.observePlayerSettingsBrio(self._playerSettingsBinder, player)
32
+ return self._settingsDataService:ObservePlayerSettingsBrio(player)
35
33
  end
36
34
 
37
35
  function SettingsService:ObservePlayerSettings(player)
38
36
  assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
39
37
 
40
- return PlayerSettingsUtils.observePlayerSettings(self._playerSettingsBinder, player)
38
+ return self._settingsDataService:ObservePlayerSettings(player)
41
39
  end
42
40
 
43
41
  function SettingsService:GetPlayerSettings(player)
44
42
  assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
45
43
 
46
- return PlayerSettingsUtils.getPlayerSettings(self._playerSettingsBinder, player)
44
+ return self._settingsDataService:GetPlayerSettings(player)
47
45
  end
48
46
 
49
47
  function SettingsService:PromisePlayerSettings(player, cancelToken)
50
48
  assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
51
49
 
52
- return Rx.toPromise(self:ObservePlayerSettings(player):Pipe({
53
- Rx.where(function(x)
54
- return x ~= nil
55
- end)
56
- }), cancelToken)
50
+ return self._settingsDataService:PromisePlayerSettings(player, cancelToken)
57
51
  end
58
52
 
59
53
  function SettingsService:Destroy()
@@ -5,18 +5,18 @@
5
5
  local require = require(script.Parent.loader).load(script)
6
6
 
7
7
  local ServiceBag = require("ServiceBag")
8
- local SettingRegistryServiceShared = require("SettingRegistryServiceShared")
8
+ local SettingsDataService = require("SettingsDataService")
9
9
 
10
10
  local SettingsCmdrUtils = {}
11
11
 
12
12
  function SettingsCmdrUtils.registerSettingDefinition(cmdr, serviceBag)
13
13
  assert(ServiceBag.isServiceBag(serviceBag), "Bad serviceBag")
14
14
 
15
- local settingRegistryService = serviceBag:GetService(SettingRegistryServiceShared)
15
+ local settingsDataService = serviceBag:GetService(SettingsDataService)
16
16
 
17
17
  local settingDefinitionType = {
18
18
  Transform = function(text)
19
- local definitions = settingRegistryService:GetSettingDefinitions()
19
+ local definitions = settingsDataService:GetSettingDefinitions()
20
20
  local settingNames = {}
21
21
  for _, settingDefinition in pairs(definitions) do
22
22
  table.insert(settingNames, settingDefinition:GetSettingName())
@@ -34,7 +34,7 @@ function SettingsCmdrUtils.registerSettingDefinition(cmdr, serviceBag)
34
34
  Parse = function(keys)
35
35
  local name = keys[1]
36
36
 
37
- local definitions = settingRegistryService:GetSettingDefinitions()
37
+ local definitions = settingsDataService:GetSettingDefinitions()
38
38
  for _, settingDefinition in pairs(definitions) do
39
39
  if settingDefinition:GetSettingName() == name then
40
40
  return settingDefinition
@@ -13,4 +13,5 @@ return TieDefinition.new("PlayerSettings", {
13
13
  ObserveValue = TieDefinition.Types.METHOD;
14
14
  RestoreDefault = TieDefinition.Types.METHOD;
15
15
  EnsureInitialized = TieDefinition.Types.METHOD;
16
+ GetPlayer = TieDefinition.Types.METHOD;
16
17
  })
@@ -37,7 +37,7 @@ end
37
37
  @return Player
38
38
  ]=]
39
39
  function PlayerSettingsBase:GetPlayer()
40
- return self._obj.Parent
40
+ return self._obj:FindFirstAncestorWhichIsA("Player")
41
41
  end
42
42
 
43
43
  --[=[
@@ -8,10 +8,6 @@ local require = require(script.Parent.loader).load(script)
8
8
 
9
9
  local PlayerSettingsConstants = require("PlayerSettingsConstants")
10
10
  local String = require("String")
11
- local RxBinderUtils = require("RxBinderUtils")
12
- local BinderUtils = require("BinderUtils")
13
- local Binder = require("Binder")
14
- local RxStateStackUtils = require("RxStateStackUtils")
15
11
  local EnumUtils = require("EnumUtils")
16
12
  local DataStoreStringUtils = require("DataStoreStringUtils")
17
13
 
@@ -30,47 +26,6 @@ function PlayerSettingsUtils.create()
30
26
  return playerSettings
31
27
  end
32
28
 
33
- --[=[
34
- Observe a player settings for a player.
35
-
36
- @param binder Binder<PlayerSettings>
37
- @param player Player
38
- @return Observable<PlayerSettings>
39
- ]=]
40
- function PlayerSettingsUtils.observePlayerSettingsBrio(binder, player)
41
- assert(Binder.isBinder(binder), "No binder")
42
- assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
43
-
44
- return RxBinderUtils.observeBoundChildClassBrio(binder, player)
45
- end
46
-
47
- --[=[
48
- Observe a player's latest settings
49
-
50
- @param binder Binder<PlayerSettings>
51
- @param player Player
52
- @return Observable<PlayerSettings>
53
- ]=]
54
- function PlayerSettingsUtils.observePlayerSettings(binder, player)
55
- return RxBinderUtils.observeBoundChildClassBrio(binder, player):Pipe({
56
- RxStateStackUtils.topOfStack()
57
- })
58
- end
59
-
60
- --[=[
61
- Gets a player's latest settings
62
-
63
- @param binder Binder<PlayerSettings>
64
- @param player Player
65
- @return PlayerSettings
66
- ]=]
67
- function PlayerSettingsUtils.getPlayerSettings(binder, player)
68
- assert(Binder.isBinder(binder), "No binder")
69
- assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
70
-
71
- return BinderUtils.findFirstChild(binder, player)
72
- end
73
-
74
29
  --[=[
75
30
  Gets the attribute name for a setting
76
31
 
@@ -22,7 +22,7 @@ local require = require(script.Parent.loader).load(script)
22
22
 
23
23
  local Players = game:GetService("Players")
24
24
 
25
- local SettingRegistryServiceShared = require("SettingRegistryServiceShared")
25
+ local SettingsDataService = require("SettingsDataService")
26
26
  local SettingProperty = require("SettingProperty")
27
27
  local ServiceBag = require("ServiceBag")
28
28
  local DuckTypeUtils = require("DuckTypeUtils")
@@ -66,8 +66,8 @@ function SettingDefinition:Init(serviceBag)
66
66
  self._maid = Maid.new()
67
67
  self._serviceBag = assert(serviceBag, "No serviceBag")
68
68
 
69
- local settingRegistryServiceShared = self._serviceBag:GetService(SettingRegistryServiceShared)
70
- self._maid:GiveTask(settingRegistryServiceShared:RegisterSettingDefinition(self))
69
+ local settingsDataService = self._serviceBag:GetService(SettingsDataService)
70
+ self._maid:GiveTask(settingsDataService:RegisterSettingDefinition(self))
71
71
  end
72
72
 
73
73
  --[=[
@@ -4,10 +4,10 @@
4
4
 
5
5
  :::tip
6
6
  These settings providers should be used on both the client and the server. On the client, these
7
- are registered with the [SettingRegistryServiceShared] so that they can be shown in UI automatically
7
+ are registered with the [SettingsDataService] so that they can be shown in UI automatically
8
8
  if desired.
9
9
 
10
- On the server, these are registered with [SettingRegistryServiceShared] and then are checked before
10
+ On the server, these are registered with [SettingsDataService] and then are checked before
11
11
  arbitrary data can e sent.
12
12
  :::
13
13
 
@@ -100,7 +100,7 @@ function SettingDefinitionProvider:_addSettingDefinition(settingDefinition)
100
100
  end
101
101
 
102
102
  --[=[
103
- Initializes the provider, storing the data in [SettingRegistryServiceShared]
103
+ Initializes the provider, storing the data in [SettingsDataService]
104
104
 
105
105
  @param serviceBag ServiceBag
106
106
  ]=]
@@ -4,7 +4,7 @@
4
4
 
5
5
  local require = require(script.Parent.loader).load(script)
6
6
 
7
- local SettingRegistryServiceShared = require("SettingRegistryServiceShared")
7
+ local SettingsDataService = require("SettingsDataService")
8
8
  local Rx = require("Rx")
9
9
 
10
10
  local SettingProperty = {}
@@ -23,7 +23,7 @@ function SettingProperty.new(serviceBag, player, definition)
23
23
  local self = setmetatable({}, SettingProperty)
24
24
 
25
25
  self._serviceBag = assert(serviceBag, "No serviceBag")
26
- self._bridge = self._serviceBag:GetService(SettingRegistryServiceShared)
26
+ self._bridge = self._serviceBag:GetService(SettingsDataService)
27
27
 
28
28
  self._player = assert(player, "No player")
29
29
  self._definition = assert(definition, "No definition")
@@ -0,0 +1,174 @@
1
+ --[=[
2
+ Shared between client and server, letting us centralize definitions in one place.
3
+
4
+ @class SettingsDataService
5
+ ]=]
6
+
7
+ local require = require(script.Parent.loader).load(script)
8
+
9
+ local Players = game:GetService("Players")
10
+
11
+ local Maid = require("Maid")
12
+ local ObservableMap = require("ObservableMap")
13
+ local ObservableSet = require("ObservableSet")
14
+ local PlayerSettingsInterface = require("PlayerSettingsInterface")
15
+ local Rx = require("Rx")
16
+ local RxBrioUtils = require("RxBrioUtils")
17
+ local RxInstanceUtils = require("RxInstanceUtils")
18
+
19
+ local SettingsDataService = {}
20
+
21
+ --[=[
22
+ Initializes the shared registry service. Should be done via [ServiceBag].
23
+
24
+ @param serviceBag ServiceBag
25
+ ]=]
26
+ function SettingsDataService:Init(serviceBag)
27
+ assert(not self._serviceBag, "Already initialized")
28
+ self._serviceBag = assert(serviceBag, "No serviceBag")
29
+ self._maid = Maid.new()
30
+
31
+ -- External
32
+ self._tieRealmService = self._serviceBag:GetService(require("TieRealmService"))
33
+
34
+ -- State
35
+ self._settingDefinitions = self._maid:Add(ObservableSet.new())
36
+ end
37
+
38
+ function SettingsDataService:_getPlayerSettingsCacheMap()
39
+ -- Avoid hydrating
40
+ if self._playerSettingsCacheMap then
41
+ return self._playerSettingsCacheMap
42
+ end
43
+
44
+ self._playerSettingsCacheMap = self._maid:Add(ObservableMap.new())
45
+ self._hydratedPlayersMaid = self._maid:Add(Maid.new())
46
+
47
+ self._maid:GiveTask(Players.PlayerRemoving:Connect(function(player)
48
+ self._hydratedPlayersMaid[player] = nil
49
+ end))
50
+
51
+ return self._playerSettingsCacheMap
52
+ end
53
+
54
+ function SettingsDataService:_getPlayerSettingsMapForPlayer(player)
55
+ local playerSettingsCacheMap = self:_getPlayerSettingsCacheMap()
56
+
57
+ if self._hydratedPlayersMaid[player] then
58
+ return playerSettingsCacheMap
59
+ end
60
+
61
+ -- Note we only do this as requested to save memory. On the client, we're unlikely
62
+ -- to even query other player's settings.
63
+ self._hydratedPlayersMaid[player] = self:_hydrateCacheForPlayer(player)
64
+
65
+ return playerSettingsCacheMap
66
+ end
67
+
68
+ function SettingsDataService:_hydrateCacheForPlayer(player)
69
+ local playerMaid = Maid.new()
70
+
71
+ playerMaid:GiveTask(RxInstanceUtils.observeChildrenBrio(player, function(value)
72
+ -- We really only care about this, and we can assume we have the tag immediately
73
+ return value:HasTag("PlayerSettings")
74
+ end):Pipe({
75
+ RxBrioUtils.flatMapBrio(function(playerSettingsInstance)
76
+ return PlayerSettingsInterface:ObserveBrio(playerSettingsInstance, self._tieRealmService:GetTieRealm())
77
+ end)
78
+ }):Subscribe(function(brio)
79
+ if brio:IsDead() then
80
+ return
81
+ end
82
+
83
+ local maid, playerSettings = brio:ToMaidAndValue()
84
+ maid:GiveTask(self._playerSettingsCacheMap:Set(playerSettings:GetPlayer(), playerSettings))
85
+ end))
86
+
87
+ return playerMaid
88
+ end
89
+
90
+ function SettingsDataService:GetSettingDefinitions()
91
+ return self._settingDefinitions:GetList()
92
+ end
93
+
94
+ --[=[
95
+ Registers settings definitions
96
+
97
+ @param definition SettingDefinition
98
+ @return callback -- Cleanup callback
99
+ ]=]
100
+ function SettingsDataService:RegisterSettingDefinition(definition)
101
+ assert(definition, "No definition")
102
+
103
+ return self._settingDefinitions:Add(definition)
104
+ end
105
+
106
+ --[=[
107
+ Observes the registered definitions
108
+
109
+ @return Observable<Brio<SettingDefinition>>
110
+ ]=]
111
+ function SettingsDataService:ObserveRegisteredDefinitionsBrio()
112
+ return self._settingDefinitions:ObserveItemsBrio()
113
+ end
114
+
115
+
116
+ --[=[
117
+ Observes the player's settings
118
+
119
+ @param player Player
120
+ @return Observable<PlayerSettingsBase>
121
+ ]=]
122
+ function SettingsDataService:ObservePlayerSettings(player)
123
+ assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
124
+
125
+ return self:_getPlayerSettingsMapForPlayer(player):ObserveAtKey(player, self._tieRealmService:GetTieRealm())
126
+ end
127
+
128
+ --[=[
129
+ Observes the player settings in a brio
130
+
131
+ @param player Player
132
+ @return Observable<Brio<PlayerSettingsClient>>
133
+ ]=]
134
+ function SettingsDataService:ObservePlayerSettingsBrio(player)
135
+ return self:_getPlayerSettingsMapForPlayer(player):ObserveAtKeyBrio(player, self._tieRealmService:GetTieRealm())
136
+ end
137
+
138
+ --[=[
139
+ Promises the player's settings
140
+
141
+ @param player Player
142
+ @param cancelToken CancelToken
143
+ @return Promise<PlayerSettingsBase>
144
+ ]=]
145
+ function SettingsDataService:PromisePlayerSettings(player, cancelToken)
146
+ assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
147
+
148
+ return Rx.toPromise(self:ObservePlayerSettings(player):Pipe({
149
+ Rx.where(function(playerSettings)
150
+ return playerSettings ~= nil
151
+ end)
152
+ }), cancelToken)
153
+ end
154
+
155
+ --[=[
156
+ Gets the player's settings
157
+
158
+ @param player Player
159
+ @return Promise<PlayerSettingsBase>
160
+ ]=]
161
+ function SettingsDataService:GetPlayerSettings(player)
162
+ assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
163
+
164
+ return self:_getPlayerSettingsMapForPlayer(player):Get(player)
165
+ end
166
+
167
+ --[=[
168
+ Cleans up the shared registry service
169
+ ]=]
170
+ function SettingsDataService:Destroy()
171
+ self._maid:DoCleaning()
172
+ end
173
+
174
+ return SettingsDataService
@@ -1,148 +0,0 @@
1
- --[=[
2
- Shared between client and server, letting us centralize definitions in one place.
3
-
4
- @class SettingRegistryServiceShared
5
- ]=]
6
-
7
- local require = require(script.Parent.loader).load(script)
8
-
9
- local ValueObject = require("ValueObject")
10
- local Rx = require("Rx")
11
- local ObservableSet = require("ObservableSet")
12
- local Maid = require("Maid")
13
-
14
- local SettingRegistryServiceShared = {}
15
-
16
- --[=[
17
- Initializes the shared registry service. Should be done via [ServiceBag].
18
-
19
- @param serviceBag ServiceBag
20
- ]=]
21
- function SettingRegistryServiceShared:Init(serviceBag)
22
- assert(not self._serviceBag, "Already initialized")
23
- self._serviceBag = assert(serviceBag, "No serviceBag")
24
- self._maid = Maid.new()
25
-
26
- self._settingService = ValueObject.new()
27
- self._maid:GiveTask(self._settingService)
28
-
29
- self._settingDefinitions = ObservableSet.new()
30
- self._maid:GiveTask(self._settingDefinitions)
31
- end
32
-
33
- function SettingRegistryServiceShared:GetSettingDefinitions()
34
- return self._settingDefinitions:GetList()
35
- end
36
-
37
- --[=[
38
- Registers the shared setting service for this bridge
39
-
40
- @param settingService SettingService
41
- ]=]
42
- function SettingRegistryServiceShared:RegisterSettingService(settingService)
43
- self._settingService.Value = settingService
44
- end
45
-
46
- --[=[
47
- Registers settings definitions
48
-
49
- @param definition SettingDefinition
50
- @return callback -- Cleanup callback
51
- ]=]
52
- function SettingRegistryServiceShared:RegisterSettingDefinition(definition)
53
- assert(definition, "No definition")
54
-
55
- return self._settingDefinitions:Add(definition)
56
- end
57
-
58
- --[=[
59
- Observes the registered definitions
60
-
61
- @return Observable<Brio<SettingDefinition>>
62
- ]=]
63
- function SettingRegistryServiceShared:ObserveRegisteredDefinitionsBrio()
64
- return self._settingDefinitions:ObserveItemsBrio()
65
- end
66
-
67
- --[=[
68
- Gets the current settings service
69
-
70
- @return SettingService
71
- ]=]
72
- function SettingRegistryServiceShared:GetSettingsService()
73
- return self._settingService.Value
74
- end
75
-
76
- --[=[
77
- Observes the current settings service
78
-
79
- @return Observable<SettingService>
80
- ]=]
81
- function SettingRegistryServiceShared:ObserveSettingsService()
82
- return self._settingService:Observe()
83
- end
84
-
85
- --[=[
86
- Observes the player's settings
87
-
88
- @param player Player
89
- @return Observable<PlayerSettingsBase>
90
- ]=]
91
- function SettingRegistryServiceShared:ObservePlayerSettings(player)
92
- assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
93
-
94
- return self:ObserveSettingsService():Pipe({
95
- Rx.switchMap(function(settingService)
96
- if settingService then
97
- return settingService:ObservePlayerSettings(player)
98
- else
99
- return Rx.of(nil)
100
- end
101
- end)
102
- })
103
- end
104
-
105
- --[=[
106
- Promises the player's settings
107
-
108
- @param player Player
109
- @return Promise<PlayerSettingsBase>
110
- ]=]
111
- function SettingRegistryServiceShared:PromisePlayerSettings(player)
112
- assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
113
-
114
- return Rx.toPromise(self._settingService:Observe():Pipe({
115
- Rx.where(function(x)
116
- return x ~= nil
117
- end)
118
- }))
119
- :Then(function(settingService)
120
- return settingService:PromisePlayerSettings(player)
121
- end)
122
- end
123
-
124
- --[=[
125
- Gets the player's settings
126
-
127
- @param player Player
128
- @return Promise<PlayerSettingsBase>
129
- ]=]
130
- function SettingRegistryServiceShared:GetPlayerSettings(player)
131
- assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
132
-
133
- local settingService = self._settingService.Value
134
- if settingService then
135
- return settingService:GetPlayerSettings(player)
136
- else
137
- return nil
138
- end
139
- end
140
-
141
- --[=[
142
- Cleans up the shared registry service
143
- ]=]
144
- function SettingRegistryServiceShared:Destroy()
145
- self._maid:DoCleaning()
146
- end
147
-
148
- return SettingRegistryServiceShared