|
| 1 | +--[[ |
| 2 | + Metrik SDK - https://github.com/metrik-tech/sdk |
| 3 | +]] |
| 4 | + |
| 5 | +local Runtime = require(script.Parent.Packages.Runtime) |
| 6 | +local Promise = require(script.Parent.Packages.Promise) |
| 7 | +local Console = require(script.Parent.Packages.Console) |
| 8 | + |
| 9 | +local Error = require(script.Parent.Enums.Error) |
| 10 | + |
| 11 | +local ErrorFormats = require(script.Parent.Data.ErrorFormats) |
| 12 | + |
| 13 | +local Action = require(script.Parent.API.Action) |
| 14 | + |
| 15 | +local ApiService = require(script.Parent.Services.ApiService) |
| 16 | + |
| 17 | +local ON_INIT_LIFECYCLE_NAME = "OnInit" |
| 18 | +local ON_START_LIFECYCLE_NAME = "OnStart" |
| 19 | + |
| 20 | +--[=[ |
| 21 | + @class MetrikSDK.Server |
| 22 | +
|
| 23 | + The base class developers will be interacting with. *(TO-DO: add a descriptive class description!)* |
| 24 | +]=] |
| 25 | +local MetrikSDK = {} |
| 26 | + |
| 27 | +MetrikSDK.Public = {} |
| 28 | +MetrikSDK.Private = {} |
| 29 | + |
| 30 | +MetrikSDK.Public.Private = MetrikSDK.Private |
| 31 | +MetrikSDK.Private.Public = MetrikSDK.Public |
| 32 | + |
| 33 | +MetrikSDK.Private.Reporter = Console.new("MetrikSDK-Server") |
| 34 | +MetrikSDK.Private.IsInitialized = false |
| 35 | +MetrikSDK.Private.ProjectId = "" |
| 36 | + |
| 37 | +--[=[ |
| 38 | + @prop Action Action |
| 39 | + @within MetrikSDK.Server |
| 40 | +]=] |
| 41 | +-- |
| 42 | +MetrikSDK.Public.Action = Action |
| 43 | + |
| 44 | +function MetrikSDK.Private.FromError(_: MetrikPrivateAPI, errorEnum: string, ...: string) |
| 45 | + return string.format(ErrorFormats[errorEnum], ...) |
| 46 | +end |
| 47 | + |
| 48 | +--[=[ |
| 49 | + ... |
| 50 | +
|
| 51 | + @method SetAuthenticationToken |
| 52 | + @within MetrikSDK.Server |
| 53 | +
|
| 54 | + @return () |
| 55 | +]=] |
| 56 | +-- |
| 57 | +function MetrikSDK.Public.SetAuthenticationToken(self: MetrikPublicAPI, projectId: string) |
| 58 | + self.Private.Reporter:Assert( |
| 59 | + not self.Private.IsInitialized, |
| 60 | + self.Private:FromError(Error.ExpectedCallAfterCall, "Metrik:SetAuthenticationToken", "Metrik:InitializeAsync") |
| 61 | + ) |
| 62 | + |
| 63 | + ApiService:SetAuthenticationToken(projectId) |
| 64 | + ApiService:SetProjectId(projectId) |
| 65 | +end |
| 66 | + |
| 67 | +--[=[ |
| 68 | + Start the Metrik SDK, once this function has been called, internal Metrik Services and Controllers should come online and start to respond and |
| 69 | + handle Metrik backend calls made to the current Roblox server. |
| 70 | +
|
| 71 | + :::warning |
| 72 | + Please ensure that any pre-init variables are set before calling this function, otherwise Metrik will have issues attempting to authenticate |
| 73 | + the current SDK! |
| 74 | + ::: |
| 75 | +
|
| 76 | + @method InitializeAsync |
| 77 | + @within MetrikSDK.Server |
| 78 | +
|
| 79 | + @return Promise<()> |
| 80 | +]=] |
| 81 | +-- |
| 82 | +function MetrikSDK.Public.InitializeAsync(self: MetrikPublicAPI) |
| 83 | + return Promise.new(function(resolve, reject) |
| 84 | + if self.Private.IsInitialized then |
| 85 | + return reject(self.Private:FromError(Error.AlreadyInitializedError)) |
| 86 | + end |
| 87 | + |
| 88 | + local runtimeClockSnapshot = os.clock() |
| 89 | + local metrikServices = Runtime:RequireChildren( |
| 90 | + script.Parent.Services, |
| 91 | + function(module: ModuleScript, moduleContent: { [any]: any }) |
| 92 | + self.Private.Reporter:Debug(`Loading MetrikSDK Service module: '{module.Name}'`) |
| 93 | + |
| 94 | + return moduleContent |
| 95 | + end |
| 96 | + ) |
| 97 | + |
| 98 | + table.sort(metrikServices, function(serviceA, serviceB) |
| 99 | + return (serviceA.Priority or 0) > (serviceB.Priority or 0) |
| 100 | + end) |
| 101 | + |
| 102 | + Runtime:CallMethodOn(metrikServices, ON_INIT_LIFECYCLE_NAME) |
| 103 | + Runtime:CallMethodOn(metrikServices, ON_START_LIFECYCLE_NAME) |
| 104 | + |
| 105 | + self.Private.IsInitialized = true |
| 106 | + |
| 107 | + self.Private.Reporter:Debug(`Loaded all MetrikSDK Services ({os.clock() - runtimeClockSnapshot}ms)`) |
| 108 | + |
| 109 | + return resolve() |
| 110 | + end) |
| 111 | +end |
| 112 | + |
| 113 | +type MetrikPublicAPI = typeof(MetrikSDK.Public) |
| 114 | +type MetrikPrivateAPI = typeof(MetrikSDK.Private) |
| 115 | + |
| 116 | +export type MetrikSDK = MetrikPublicAPI & { Private: nil } |
| 117 | + |
| 118 | +return MetrikSDK.Public |
0 commit comments