diff --git a/src/Packages/Audience/Runtime/AudienceConfig.cs b/src/Packages/Audience/Runtime/AudienceConfig.cs
new file mode 100644
index 000000000..759645562
--- /dev/null
+++ b/src/Packages/Audience/Runtime/AudienceConfig.cs
@@ -0,0 +1,17 @@
+namespace Immutable.Audience
+{
+ /// Configuration passed to .
+ public class AudienceConfig
+ {
+ public string PublishableKey { get; set; }
+ public ConsentLevel Consent { get; set; } = ConsentLevel.None;
+ ///
+ /// Distribution platform the game is running on.
+ /// Use for common values, or pass any custom string.
+ ///
+ public string DistributionPlatform { get; set; }
+ public bool Debug { get; set; } = false;
+ public int FlushIntervalSeconds { get; set; } = Constants.DefaultFlushIntervalSeconds;
+ public int FlushSize { get; set; } = Constants.DefaultFlushSize;
+ }
+}
diff --git a/src/Packages/Audience/Runtime/AudienceConfig.cs.meta b/src/Packages/Audience/Runtime/AudienceConfig.cs.meta
new file mode 100644
index 000000000..ab5d113be
--- /dev/null
+++ b/src/Packages/Audience/Runtime/AudienceConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0815c3d8a1164cd8811176be7d640aff
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/Packages/Audience/Runtime/AudienceError.cs b/src/Packages/Audience/Runtime/AudienceError.cs
new file mode 100644
index 000000000..3e57ada0b
--- /dev/null
+++ b/src/Packages/Audience/Runtime/AudienceError.cs
@@ -0,0 +1,23 @@
+using System;
+
+namespace Immutable.Audience
+{
+ public enum AudienceErrorCode
+ {
+ FlushFailed,
+ ValidationRejected,
+ ConsentSyncFailed,
+ NetworkError
+ }
+
+ public class AudienceError : Exception
+ {
+ public AudienceErrorCode Code { get; }
+
+ public AudienceError(AudienceErrorCode code, string message)
+ : base(message)
+ {
+ Code = code;
+ }
+ }
+}
diff --git a/src/Packages/Audience/Runtime/AudienceError.cs.meta b/src/Packages/Audience/Runtime/AudienceError.cs.meta
new file mode 100644
index 000000000..b1b7d9574
--- /dev/null
+++ b/src/Packages/Audience/Runtime/AudienceError.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 93fbfe0c15974366b7a16693ceedb4df
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/Packages/Audience/Runtime/ConsentLevel.cs b/src/Packages/Audience/Runtime/ConsentLevel.cs
new file mode 100644
index 000000000..66e518c05
--- /dev/null
+++ b/src/Packages/Audience/Runtime/ConsentLevel.cs
@@ -0,0 +1,13 @@
+namespace Immutable.Audience
+{
+ /// Controls what the Audience SDK tracks.
+ public enum ConsentLevel
+ {
+ /// SDK inert. No events queued or sent. No IDs persisted to disk.
+ None,
+ /// Track events with anonymousId only. Identify/Alias discarded with warning.
+ Anonymous,
+ /// All events. Identify/Alias send. userId attached to track events.
+ Full
+ }
+}
diff --git a/src/Packages/Audience/Runtime/ConsentLevel.cs.meta b/src/Packages/Audience/Runtime/ConsentLevel.cs.meta
new file mode 100644
index 000000000..4f6dee409
--- /dev/null
+++ b/src/Packages/Audience/Runtime/ConsentLevel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 03ccd5190cb24864a2cde2c94f68b7f3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/Packages/Audience/Runtime/Core.meta b/src/Packages/Audience/Runtime/Core.meta
new file mode 100644
index 000000000..e353cf31f
--- /dev/null
+++ b/src/Packages/Audience/Runtime/Core.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fecac2b913974672addc6aa5d735c058
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/Packages/Audience/Runtime/Core/Constants.cs b/src/Packages/Audience/Runtime/Core/Constants.cs
new file mode 100644
index 000000000..6573730d8
--- /dev/null
+++ b/src/Packages/Audience/Runtime/Core/Constants.cs
@@ -0,0 +1,40 @@
+namespace Immutable.Audience
+{
+ internal static class Constants
+ {
+ internal const string TestKeyPrefix = "pk_imapik-test-";
+ internal const string SandboxBaseUrl = "https://api.sandbox.immutable.com";
+ internal const string ProductionBaseUrl = "https://api.immutable.com";
+
+ internal const string MessagesPath = "/v1/audience/messages";
+ internal const string ConsentPath = "/v1/audience/tracking-consent";
+ internal const string DataPath = "/v1/audience/data";
+
+ internal const int DefaultFlushIntervalSeconds = 5;
+ internal const int DefaultFlushSize = 20;
+ internal const int MaxBatchSize = 100;
+ internal const int StaleEventDays = 30;
+
+ internal const string LibraryName = "com.immutable.audience";
+ internal const string Surface = "unity";
+ internal const string ConsentSource = "UnitySDK";
+
+ internal static string BaseUrl(string publishableKey) =>
+ publishableKey != null && publishableKey.StartsWith(TestKeyPrefix)
+ ? SandboxBaseUrl
+ : ProductionBaseUrl;
+ }
+
+ ///
+ /// String constants for common game distribution platforms.
+ /// Any string is accepted -- studios are not limited to these values.
+ ///
+ public static class DistributionPlatforms
+ {
+ public const string Steam = "steam";
+ public const string Epic = "epic";
+ public const string GOG = "gog";
+ public const string Itch = "itch";
+ public const string Standalone = "standalone";
+ }
+}
diff --git a/src/Packages/Audience/Runtime/Core/Constants.cs.meta b/src/Packages/Audience/Runtime/Core/Constants.cs.meta
new file mode 100644
index 000000000..d222e9aa5
--- /dev/null
+++ b/src/Packages/Audience/Runtime/Core/Constants.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ecbefc60c65a4c0f961601a2a47b5c8f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/Packages/Audience/Runtime/ImmutableAudience.cs b/src/Packages/Audience/Runtime/ImmutableAudience.cs
index 677c80370..6c882b7b7 100644
--- a/src/Packages/Audience/Runtime/ImmutableAudience.cs
+++ b/src/Packages/Audience/Runtime/ImmutableAudience.cs
@@ -2,11 +2,17 @@ namespace Immutable.Audience
{
///
/// Entry point for the Immutable Audience SDK.
- /// Call Init once on startup, then use the static methods from any thread.
+ /// Call once on startup, then use the static methods from any thread.
///
public static class ImmutableAudience
{
- // Core types (AudienceConfig, ConsentLevel, AudienceError) and Init
- // are added in the next PR once those types exist. See SDK-119.
+ // Scaffold only -- implementation follows in subsequent sub-issues (see SDK-99).
+
+ /// Initialise the SDK. Call once, typically in your game's entry scene.
+ public static void Init(AudienceConfig config)
+ {
+ throw new System.NotImplementedException(
+ "Immutable Audience SDK: implementation pending. See SDK-99.");
+ }
}
}
diff --git a/src/Packages/Audience/Runtime/ImmutableAudience.cs.meta b/src/Packages/Audience/Runtime/ImmutableAudience.cs.meta
index 6e249f726..bf98375d9 100644
--- a/src/Packages/Audience/Runtime/ImmutableAudience.cs.meta
+++ b/src/Packages/Audience/Runtime/ImmutableAudience.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 9e8335985aa845dbb0edd341b6b4ecd4
+guid: 6c42c74555864965bb48ea6a2bd9c915
MonoImporter:
externalObjects: {}
serializedVersion: 2