Skip to content

Commit 987095a

Browse files
committed
Add LogLeve to KMP layer. Initial commit.
In next commit logVerbosity should be removed from: commonMain/kotlin/com/pubnub/api/v2/PNConfiguration.kt and platform specific implementations
1 parent bdcdeb1 commit 987095a

File tree

16 files changed

+385
-141
lines changed

16 files changed

+385
-141
lines changed

pubnub-gson/pubnub-gson-docs/src/main/java/com/pubnub/docs/presence/HereNowApp.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ public static void main(String[] args) throws PubNubException {
1818
// Configure PubNub instance
1919
PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("demoUserId"), "demo");
2020
configBuilder.publishKey("demo");
21-
configBuilder.logVerbosity(PNLogVerbosity.BODY);
2221
configBuilder.secure(true);
2322

2423
PubNub pubnub = PubNub.create(configBuilder.build());

pubnub-gson/pubnub-gson-impl/src/integrationTest/java/com/pubnub/api/integration/managers/subscription/ReconnectionProblemWithoutRetryConfigurationIT.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public class ReconnectionProblemWithoutRetryConfigurationIT extends AbstractReco
2323
pnConfiguration.subscribeKey(itPamTestConfig.pamSubKey());
2424
pnConfiguration.publishKey(itPamTestConfig.pamPubKey());
2525
pnConfiguration.subscribeTimeout(SUBSCRIBE_TIMEOUT);
26-
pnConfiguration.logVerbosity(BODY);
2726
pnConfiguration.authKey(authKey);
2827
pnConfiguration.retryConfiguration(RetryConfiguration.None.INSTANCE);
2928
return PubNub.create(pnConfiguration.build());

pubnub-gson/pubnub-gson-impl/src/integrationTest/java/com/pubnub/api/integration/objects/ObjectsApiBaseIT.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ private PubNub pubNub() {
2929
throw new RuntimeException(e);
3030
}
3131
pnConfiguration.subscribeKey(itTestConfig.subscribeKey());
32-
pnConfiguration.logVerbosity(PNLogVerbosity.BODY);
3332

3433
return PubNub.create(pnConfiguration.build());
3534
}

pubnub-gson/pubnub-gson-impl/src/integrationTest/java/com/pubnub/api/integration/pam/GrantTokenIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void happyPath_SUM() throws PubNubException {
5454
@Test
5555
public void happyPath() throws PubNubException {
5656
//given
57-
PubNub pubNubUnderTest = getServer(builder -> builder.logVerbosity(PNLogVerbosity.BODY));
57+
PubNub pubNubUnderTest = getServer();
5858
final int expectedTTL = 1337;
5959
final String expectedChannelResourceName = "channelResource";
6060
final String expectedChannelPattern = "channel.*";

pubnub-kotlin/pubnub-kotlin-api/config/ktlint/baseline.xml

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,44 +8,34 @@
88
</file>
99
<file name="src/jsMain/kotlin/Pubnub.d.kt">
1010
<error line="156" column="40" source="standard:comment-wrapping" />
11-
<error line="413" column="15" source="standard:class-naming" />
12-
<error line="430" column="15" source="standard:class-naming" />
13-
<error line="446" column="15" source="standard:class-naming" />
14-
<error line="458" column="15" source="standard:class-naming" />
15-
<error line="466" column="15" source="standard:class-naming" />
16-
<error line="474" column="15" source="standard:class-naming" />
17-
<error line="490" column="15" source="standard:class-naming" />
18-
<error line="503" column="15" source="standard:class-naming" />
19-
<error line="855" column="13" source="standard:property-naming" />
20-
<error line="1040" column="15" source="standard:class-naming" />
21-
<error line="1046" column="15" source="standard:class-naming" />
22-
<error line="1169" column="13" source="standard:property-naming" />
23-
<error line="1177" column="13" source="standard:property-naming" />
24-
<error line="1179" column="13" source="standard:property-naming" />
25-
<error line="1242" column="39" source="standard:comment-wrapping" />
26-
<error line="1317" column="15" source="standard:class-naming" />
27-
<error line="1343" column="42" source="standard:comment-wrapping" />
28-
<error line="1393" column="37" source="standard:comment-wrapping" />
29-
<error line="1414" column="13" source="standard:property-naming" />
30-
<error line="1415" column="13" source="standard:property-naming" />
31-
<error line="1419" column="13" source="standard:property-naming" />
32-
<error line="1420" column="13" source="standard:property-naming" />
33-
<error line="1439" column="9" source="standard:property-naming" />
34-
<error line="1440" column="9" source="standard:property-naming" />
35-
<error line="1441" column="9" source="standard:property-naming" />
36-
<error line="1442" column="9" source="standard:property-naming" />
37-
<error line="1443" column="9" source="standard:property-naming" />
38-
<error line="1444" column="9" source="standard:property-naming" />
39-
<error line="1445" column="9" source="standard:property-naming" />
40-
<error line="1446" column="9" source="standard:property-naming" />
41-
<error line="1447" column="9" source="standard:property-naming" />
42-
<error line="1448" column="9" source="standard:property-naming" />
43-
<error line="1449" column="9" source="standard:property-naming" />
44-
<error line="1450" column="9" source="standard:property-naming" />
45-
<error line="1454" column="9" source="standard:property-naming" />
46-
<error line="1455" column="9" source="standard:property-naming" />
47-
<error line="1456" column="9" source="standard:property-naming" />
48-
<error line="1457" column="9" source="standard:property-naming" />
11+
<error line="416" column="15" source="standard:class-naming" />
12+
<error line="433" column="15" source="standard:class-naming" />
13+
<error line="449" column="15" source="standard:class-naming" />
14+
<error line="461" column="15" source="standard:class-naming" />
15+
<error line="469" column="15" source="standard:class-naming" />
16+
<error line="477" column="15" source="standard:class-naming" />
17+
<error line="493" column="15" source="standard:class-naming" />
18+
<error line="506" column="15" source="standard:class-naming" />
19+
<error line="858" column="13" source="standard:property-naming" />
20+
<error line="1043" column="15" source="standard:class-naming" />
21+
<error line="1049" column="15" source="standard:class-naming" />
22+
<error line="1172" column="13" source="standard:property-naming" />
23+
<error line="1180" column="13" source="standard:property-naming" />
24+
<error line="1182" column="13" source="standard:property-naming" />
25+
<error line="1245" column="39" source="standard:comment-wrapping" />
26+
<error line="1320" column="15" source="standard:class-naming" />
27+
<error line="1346" column="42" source="standard:comment-wrapping" />
28+
<error line="1396" column="37" source="standard:comment-wrapping" />
29+
<error line="1417" column="13" source="standard:property-naming" />
30+
<error line="1418" column="13" source="standard:property-naming" />
31+
<error line="1422" column="13" source="standard:property-naming" />
32+
<error line="1423" column="13" source="standard:property-naming" />
33+
<error line="1436" column="13" source="standard:property-naming" />
34+
<error line="1437" column="13" source="standard:property-naming" />
35+
<error line="1438" column="13" source="standard:property-naming" />
36+
<error line="1439" column="13" source="standard:property-naming" />
37+
<error line="1440" column="13" source="standard:property-naming" />
38+
<error line="1441" column="13" source="standard:property-naming" />
4939
<error line="1458" column="9" source="standard:property-naming" />
5040
<error line="1459" column="9" source="standard:property-naming" />
5141
<error line="1460" column="9" source="standard:property-naming" />
@@ -58,9 +48,6 @@
5848
<error line="1467" column="9" source="standard:property-naming" />
5949
<error line="1468" column="9" source="standard:property-naming" />
6050
<error line="1469" column="9" source="standard:property-naming" />
61-
<error line="1470" column="9" source="standard:property-naming" />
62-
<error line="1471" column="9" source="standard:property-naming" />
63-
<error line="1472" column="9" source="standard:property-naming" />
6451
<error line="1473" column="9" source="standard:property-naming" />
6552
<error line="1474" column="9" source="standard:property-naming" />
6653
<error line="1475" column="9" source="standard:property-naming" />
@@ -78,5 +65,24 @@
7865
<error line="1487" column="9" source="standard:property-naming" />
7966
<error line="1488" column="9" source="standard:property-naming" />
8067
<error line="1489" column="9" source="standard:property-naming" />
68+
<error line="1490" column="9" source="standard:property-naming" />
69+
<error line="1491" column="9" source="standard:property-naming" />
70+
<error line="1492" column="9" source="standard:property-naming" />
71+
<error line="1493" column="9" source="standard:property-naming" />
72+
<error line="1494" column="9" source="standard:property-naming" />
73+
<error line="1495" column="9" source="standard:property-naming" />
74+
<error line="1496" column="9" source="standard:property-naming" />
75+
<error line="1497" column="9" source="standard:property-naming" />
76+
<error line="1498" column="9" source="standard:property-naming" />
77+
<error line="1499" column="9" source="standard:property-naming" />
78+
<error line="1500" column="9" source="standard:property-naming" />
79+
<error line="1501" column="9" source="standard:property-naming" />
80+
<error line="1502" column="9" source="standard:property-naming" />
81+
<error line="1503" column="9" source="standard:property-naming" />
82+
<error line="1504" column="9" source="standard:property-naming" />
83+
<error line="1505" column="9" source="standard:property-naming" />
84+
<error line="1506" column="9" source="standard:property-naming" />
85+
<error line="1507" column="9" source="standard:property-naming" />
86+
<error line="1508" column="9" source="standard:property-naming" />
8187
</file>
8288
</baseline>

pubnub-kotlin/pubnub-kotlin-api/src/appleMain/kotlin/com/pubnub/api/PubNubImpl.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ import com.pubnub.api.endpoints.push.RemoveAllPushChannelsForDevice
108108
import com.pubnub.api.endpoints.push.RemoveAllPushChannelsForDeviceImpl
109109
import com.pubnub.api.endpoints.push.RemoveChannelsFromPush
110110
import com.pubnub.api.endpoints.push.RemoveChannelsFromPushImpl
111-
import com.pubnub.api.enums.PNLogVerbosity
112111
import com.pubnub.api.enums.PNPushEnvironment
113112
import com.pubnub.api.enums.PNPushType
114113
import com.pubnub.api.models.consumer.PNBoundedPage
@@ -171,8 +170,7 @@ class PubNubImpl(private val pubNubObjC: KMPPubNub) : PubNub {
171170
"", // todo
172171
"", // todo
173172
"", // todo
174-
pubNubObjC.configObjC().authKey(),
175-
PNLogVerbosity.NONE
173+
logLevel = pubNubObjC.logLevel
176174
)
177175

178176
override fun addListener(listener: EventListener) {

pubnub-kotlin/pubnub-kotlin-api/src/jsMain/kotlin/Pubnub.d.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,10 @@ open external class PubNub(config: Any /* UUID | UserId */) {
333333
var publishKey: String?
334334
var cipherKey: String?
335335
var authKey: String?
336+
337+
@Deprecated("Use logLevel instead", ReplaceWith("logLevel"))
336338
var logVerbosity: Boolean?
339+
var logLevel: dynamic // Type: JsLogLevel value (e.g., PubNub.LogLevel.Debug)
337340
var ssl: Boolean?
338341
var origin: dynamic // String? | Array<String>?
339342
var presenceTimeout: Number?
@@ -1420,6 +1423,22 @@ open external class PubNub(config: Any /* UUID | UserId */) {
14201423
var ExponentialRetryPolicy: Any
14211424

14221425
fun notificationPayload(title: String, body: String): NotificationsPayload
1426+
1427+
// PubNub.LogLevel static property from JavaScript SDK
1428+
val LogLevel: JsLogLevel
1429+
}
1430+
1431+
/**
1432+
* External interface representing PubNub.LogLevel enum from JavaScript SDK.
1433+
* Used as: PubNub.LogLevel.Debug, PubNub.LogLevel.Info, etc.
1434+
*/
1435+
interface JsLogLevel {
1436+
val None: dynamic
1437+
val Error: dynamic
1438+
val Warn: dynamic
1439+
val Info: dynamic
1440+
val Debug: dynamic
1441+
val Trace: dynamic
14231442
}
14241443
}
14251444

pubnub-kotlin/pubnub-kotlin-api/src/jsMain/kotlin/com/pubnub/api/PubNubImpl.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ import com.pubnub.api.endpoints.push.RemoveAllPushChannelsForDevice
8888
import com.pubnub.api.endpoints.push.RemoveAllPushChannelsForDeviceImpl
8989
import com.pubnub.api.endpoints.push.RemoveChannelsFromPush
9090
import com.pubnub.api.endpoints.push.RemoveChannelsFromPushImpl
91-
import com.pubnub.api.enums.PNLogVerbosity
9291
import com.pubnub.api.enums.PNPushEnvironment
9392
import com.pubnub.api.enums.PNPushType
9493
import com.pubnub.api.models.consumer.PNBoundedPage
@@ -143,11 +142,11 @@ class PubNubImpl(val jsPubNub: PubNubJs) : PubNub {
143142

144143
override val configuration: PNConfiguration
145144
get() = createPNConfiguration( // todo test this!
146-
UserId(jsPubNub.getUUID()),
147-
jsPubNub.asDynamic().configuration.subscribeKey,
148-
jsPubNub.asDynamic().configuration.publishKey,
149-
jsPubNub.asDynamic().configuration.secretKey,
150-
jsPubNub.asDynamic().configuration.logVerbosity,
145+
userId = UserId(jsPubNub.getUUID()),
146+
subscribeKey = jsPubNub.asDynamic().configuration.subscribeKey,
147+
publishKey = jsPubNub.asDynamic().configuration.publishKey,
148+
secretKey = jsPubNub.asDynamic().configuration.secretKey,
149+
logLevel = jsPubNub.asDynamic().configuration.logLevel as? com.pubnub.api.enums.LogLevel,
151150
authToken = jsPubNub.asDynamic().configuration.authToken
152151
)
153152

@@ -1390,7 +1389,7 @@ fun PNConfiguration.toJs(): PubNubJs.PNConfiguration {
13901389
config.subscribeKey = subscribeKey
13911390
config.publishKey = publishKey
13921391
config.secretKey = secretKey
1393-
config.logVerbosity = logVerbosity == PNLogVerbosity.BODY
1392+
config.logLevel = logLevel.toJsEnum()
13941393
config.enableEventEngine = enableEventEngine
13951394
// config.authKey
13961395
// config.ssl: Boolean?
@@ -1470,3 +1469,16 @@ private fun MemberInclude.toMemberIncludeOptions(): PubNubJs.IncludeOptions {
14701469
this.typeField = this@toMemberIncludeOptions.includeType
14711470
}
14721471
}
1472+
1473+
/**
1474+
* Converts Kotlin LogLevel enum to JavaScript SDK's PubNub.LogLevel enum value.
1475+
* @internal
1476+
*/
1477+
internal fun com.pubnub.api.enums.LogLevel.toJsEnum(): dynamic = when (this) {
1478+
com.pubnub.api.enums.LogLevel.NONE -> PubNubJs.LogLevel.None
1479+
com.pubnub.api.enums.LogLevel.ERROR -> PubNubJs.LogLevel.Error
1480+
com.pubnub.api.enums.LogLevel.WARN -> PubNubJs.LogLevel.Warn
1481+
com.pubnub.api.enums.LogLevel.INFO -> PubNubJs.LogLevel.Info
1482+
com.pubnub.api.enums.LogLevel.DEBUG -> PubNubJs.LogLevel.Debug
1483+
com.pubnub.api.enums.LogLevel.TRACE -> PubNubJs.LogLevel.Trace
1484+
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package com.pubnub.api.enums
2+
3+
/**
4+
* Swift SDK log level configuration.
5+
*
6+
* Uses bitmask flags that can be combined to create custom logging configurations.
7+
* Unlike hierarchical logging, each level must be explicitly enabled.
8+
*
9+
* Example:
10+
* ```kotlin
11+
* // Predefined combinations
12+
* LogLevel.Standard // info, event, warn, error
13+
*
14+
* // Custom combination
15+
* LogLevel.custom(Level.ERROR, Level.WARN, Level.EVENT)
16+
* ```
17+
*
18+
* @see [Swift SDK Logging Documentation](https://www.pubnub.com/docs/sdks/swift/logging#log-levels)
19+
*/
20+
data class LogLevel(val levels: Set<Level>) {
21+
/**
22+
* Individual log level flags that can be combined.
23+
* Each level corresponds to a specific bitmask in the Swift SDK.
24+
*/
25+
enum class Level {
26+
/**
27+
* Logging is disabled (bitmask: 0).
28+
* Default setting.
29+
*/
30+
NONE,
31+
32+
/**
33+
* Internal operations: method calls, state-machine transitions, detailed execution flow.
34+
* Bitmask: 1 << 0
35+
*
36+
* Warning: Logs sensitive information. Use only in development.
37+
*/
38+
TRACE,
39+
40+
/**
41+
* User inputs, API parameters, HTTP requests and responses, operation results.
42+
* Bitmask: 1 << 1
43+
*
44+
* Warning: May log sensitive information. Use only in development.
45+
*/
46+
DEBUG,
47+
48+
/**
49+
* Significant events including successful initialization and configuration changes.
50+
* Bitmask: 1 << 2
51+
*/
52+
INFO,
53+
54+
/**
55+
* Internal PubNub operations or events.
56+
* Bitmask: 1 << 3
57+
*/
58+
EVENT,
59+
60+
/**
61+
* Unusual conditions and non-breaking validation warnings.
62+
* Bitmask: 1 << 4
63+
*/
64+
WARN,
65+
66+
/**
67+
* Errors, exceptions, and configuration conflicts.
68+
* Bitmask: 1 << 5
69+
*/
70+
ERROR,
71+
72+
/**
73+
* All log levels will be captured.
74+
* Bitmask: UInt32.max
75+
*
76+
* Warning: Logs sensitive information. Never use in production.
77+
*/
78+
ALL
79+
}
80+
81+
companion object {
82+
/** Logging disabled */
83+
val None = LogLevel(setOf(Level.NONE))
84+
85+
/** Only errors */
86+
val Error = LogLevel(setOf(Level.ERROR))
87+
88+
/** Warnings and errors */
89+
val Warn = LogLevel(setOf(Level.WARN, Level.ERROR))
90+
91+
/**
92+
* Production logging: info, event, warn, error.
93+
* Recommended for production environments.
94+
*/
95+
val Standard = LogLevel(setOf(Level.INFO, Level.EVENT, Level.WARN, Level.ERROR))
96+
97+
/** Info, event, warnings, and errors */
98+
val Info = LogLevel(setOf(Level.INFO, Level.EVENT, Level.WARN, Level.ERROR))
99+
100+
/**
101+
* Debug and above (excludes TRACE).
102+
* Warning: May log sensitive information.
103+
*/
104+
val Debug = LogLevel(setOf(Level.DEBUG, Level.INFO, Level.EVENT, Level.WARN, Level.ERROR))
105+
106+
/**
107+
* Everything including trace.
108+
* Warning: Logs sensitive information. Never use in production.
109+
*/
110+
val All = LogLevel(setOf(Level.ALL))
111+
112+
/** Default log level (logging disabled) */
113+
val DEFAULT = None
114+
115+
/**
116+
* Create custom combination of log levels.
117+
*
118+
* Example:
119+
* ```kotlin
120+
* val customLogs = LogLevel.custom(
121+
* Level.ERROR,
122+
* Level.WARN,
123+
* Level.EVENT
124+
* )
125+
* ```
126+
*/
127+
fun custom(vararg levels: Level) = LogLevel(levels.toSet())
128+
}
129+
}

0 commit comments

Comments
 (0)