@quenty/servicebag 11.2.0 → 11.3.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
+ # [11.3.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/servicebag@11.2.0...@quenty/servicebag@11.3.0) (2024-05-03)
7
+
8
+
9
+ ### Features
10
+
11
+ * Add logging to service bag ([d1a2804](https://github.com/Quenty/NevermoreEngine/commit/d1a28048a9fc02d8ab2d272f7a0eb1c81c4f60f6))
12
+
13
+
14
+
15
+
16
+
6
17
  # [11.2.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/servicebag@11.1.0...@quenty/servicebag@11.2.0) (2024-04-27)
7
18
 
8
19
  **Note:** Version bump only for package @quenty/servicebag
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quenty/servicebag",
3
- "version": "11.2.0",
3
+ "version": "11.3.0",
4
4
  "description": "Service providing mechanisms for Nevermore",
5
5
  "keywords": [
6
6
  "Roblox",
@@ -33,5 +33,5 @@
33
33
  "publishConfig": {
34
34
  "access": "public"
35
35
  },
36
- "gitHead": "5c9eab1eac73f0d54953cca5017b7be968182f72"
36
+ "gitHead": "afbb66378d568ebb9450db13de0b4fe61113a2f1"
37
37
  }
@@ -26,6 +26,7 @@ local require = require(script.Parent.loader).load(script)
26
26
 
27
27
  local Signal = require("Signal")
28
28
  local BaseObject = require("BaseObject")
29
+ local ServiceInitLogger = require("ServiceInitLogger")
29
30
 
30
31
  --[=[
31
32
  @interface Service
@@ -61,6 +62,9 @@ function ServiceBag.new(parentProvider)
61
62
  self._initializing = false
62
63
  self._destructing = false
63
64
 
65
+ self._serviceInitLogger = ServiceInitLogger.new("initialized")
66
+ self._serviceStartLogger = ServiceInitLogger.new("started")
67
+
64
68
  self._serviceTypesToStart = {}
65
69
 
66
70
  self._destroyingSignal = Signal.new()
@@ -68,6 +72,11 @@ function ServiceBag.new(parentProvider)
68
72
  return self
69
73
  end
70
74
 
75
+ function ServiceBag:PrintInitialization()
76
+ self._serviceInitLogger:Print()
77
+ self._serviceStartLogger:Print()
78
+ end
79
+
71
80
  --[=[
72
81
  Returns whether the value is a serviceBag
73
82
 
@@ -161,9 +170,13 @@ function ServiceBag:Start()
161
170
  if service.Start then
162
171
  local current
163
172
  task.spawn(function()
173
+ local stopClock = self._serviceStartLogger:StartInitClock(serviceName)
174
+
164
175
  debug.setmemorycategory(serviceName)
165
176
  current = coroutine.running()
166
177
  service:Start()
178
+
179
+ stopClock()
167
180
  end)
168
181
 
169
182
  local isDead = coroutine.status(current) == "dead"
@@ -272,8 +285,13 @@ function ServiceBag:_initService(serviceType)
272
285
  local current
273
286
  task.spawn(function()
274
287
  debug.setmemorycategory(serviceName)
288
+
289
+ local stopClock = self._serviceInitLogger:StartInitClock(serviceName)
290
+
275
291
  current = coroutine.running()
276
292
  service:Init(self)
293
+
294
+ stopClock()
277
295
  end)
278
296
 
279
297
  local isDead = coroutine.status(current) == "dead"
@@ -0,0 +1,100 @@
1
+ --[=[
2
+ @class ServiceInitLogger
3
+ ]=]
4
+
5
+ local require = require(script.Parent.loader).load(script)
6
+
7
+ local EPSILON = 1e-6
8
+
9
+ local ServiceInitLogger = {}
10
+ ServiceInitLogger.ClassName = "ServiceInitLogger"
11
+ ServiceInitLogger.__index = ServiceInitLogger
12
+
13
+ function ServiceInitLogger.new(action)
14
+ assert(type(action) == "string", "Bad action")
15
+ local self = setmetatable({}, ServiceInitLogger)
16
+
17
+ self._action = action
18
+ self._rootNode = {
19
+ name = "ROOT";
20
+ children = {}
21
+ }
22
+ self._stack = { self._rootNode }
23
+ self._totalTimeUsed = 0
24
+ self._initIndent = 0
25
+ self._totalServices = 0
26
+
27
+ self._startLogs = {}
28
+
29
+ return self
30
+ end
31
+
32
+ function ServiceInitLogger:StartInitClock(serviceName)
33
+ assert(type(serviceName) == "string", "serviceName")
34
+
35
+ local startTime = os.clock()
36
+
37
+ local initialIndent = self._initIndent
38
+ local initialTotalTimeUsed = self._totalTimeUsed
39
+ local initialTotalServices = self._totalServices
40
+
41
+ self._initIndent = initialIndent + 1
42
+ self._totalServices = self._totalServices + 1
43
+
44
+ local parent = self._stack[#self._stack]
45
+ local entry = {
46
+ name = serviceName;
47
+ children = {};
48
+ log = string.format("%sService is not loaded", string.rep(" ", initialIndent), serviceName)
49
+ }
50
+ table.insert(parent.children, entry)
51
+ table.insert(self._stack, entry)
52
+
53
+ return function()
54
+ for i=#self._stack, 1, -1 do
55
+ if self._stack[i] == entry then
56
+ table.remove(self._stack, i)
57
+ break
58
+ end
59
+ end
60
+
61
+ local timeUsed = (os.clock() - startTime)
62
+ local otherServiceTime = self._totalTimeUsed - initialTotalTimeUsed
63
+ local internalTimeUsed = timeUsed - otherServiceTime
64
+ local totalServices = self._totalServices - initialTotalServices - 1
65
+
66
+ self._totalTimeUsed = self._totalTimeUsed + internalTimeUsed
67
+ self._initIndent = self._initIndent - 1
68
+
69
+ if math.abs(internalTimeUsed - timeUsed) <= EPSILON then
70
+ entry.log = string.format("%sService %s %s in %0.2f ms",
71
+ string.rep(" ", initialIndent),
72
+ serviceName,
73
+ self._action,
74
+ 1000*internalTimeUsed)
75
+ else
76
+ entry.log = string.format("%sService %s %s in %0.2f ms (%0.2f ms total for %d descendants)",
77
+ string.rep(" ", initialIndent),
78
+ serviceName,
79
+ self._action,
80
+ 1000*internalTimeUsed,
81
+ 1000*timeUsed,
82
+ totalServices)
83
+ end
84
+ end
85
+ end
86
+
87
+ function ServiceInitLogger:Print()
88
+ local function recurse(node)
89
+ print(node.log)
90
+ for _, childNode in pairs(node.children) do
91
+ recurse(childNode)
92
+ end
93
+ end
94
+
95
+ for _, child in pairs(self._rootNode.children) do
96
+ recurse(child)
97
+ end
98
+ end
99
+
100
+ return ServiceInitLogger