react-native-stallion 2.3.0-alpha.1 → 2.3.0-alpha.2

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.
@@ -12,29 +12,42 @@
12
12
  #import "StallionMeta.h"
13
13
  #import "StallionMetaConstants.h"
14
14
  #import "StallionObjConstants.h"
15
+ #import <signal.h>
16
+ #import <execinfo.h>
17
+
18
+ // Forward declarations
19
+ void handleException(NSException *exception);
20
+ void handleSignal(int signal);
15
21
 
16
22
  @implementation StallionExceptionHandler
17
23
 
18
24
  NSUncaughtExceptionHandler *_defaultExceptionHandler;
25
+ BOOL exceptionAlertDismissed = FALSE;
19
26
 
20
27
  + (void)initExceptionHandler {
21
28
  if (!_defaultExceptionHandler) {
22
29
  _defaultExceptionHandler = NSGetUncaughtExceptionHandler();
23
30
  }
24
31
  NSSetUncaughtExceptionHandler(&handleException);
32
+
33
+ signal(SIGABRT, handleSignal);
34
+ signal(SIGILL, handleSignal);
35
+ signal(SIGSEGV, handleSignal);
36
+ signal(SIGFPE, handleSignal);
37
+ signal(SIGBUS, handleSignal);
25
38
  }
26
39
 
27
- BOOL exceptionAlertDismissed = FALSE;
40
+ @end
28
41
 
29
- void handleException(NSException *exception) {
42
+ #pragma mark - Shared Rollback Logic
43
+
44
+ static void performStallionRollback(NSString *errorString) {
30
45
  StallionStateManager *stateManager = [StallionStateManager sharedInstance];
31
46
  StallionMeta *meta = stateManager.stallionMeta;
32
47
  BOOL isAutoRollback = !stateManager.isMounted;
33
-
34
- NSString *readableError = [exception reason];
35
48
 
36
- if (readableError.length > 900) {
37
- readableError = [readableError substringToIndex:900];
49
+ if (errorString.length > 900) {
50
+ errorString = [errorString substringToIndex:900];
38
51
  }
39
52
 
40
53
  if (meta.switchState == SwitchStateProd) {
@@ -42,12 +55,12 @@ void handleException(NSException *exception) {
42
55
 
43
56
  [[StallionEventHandler sharedInstance] cacheEvent:StallionObjConstants.exception_prod_event
44
57
  eventPayload:@{
45
- @"meta": readableError,
58
+ @"meta": errorString,
46
59
  StallionObjConstants.release_hash_key: currentHash,
47
60
  StallionObjConstants.is_auto_rollback_key: isAutoRollback ? @"true" : @"false"
48
61
  }];
49
62
  if (isAutoRollback) {
50
- [StallionSlotManager rollbackProdWithAutoRollback:YES errorString:readableError];
63
+ [StallionSlotManager rollbackProdWithAutoRollback:YES errorString:errorString];
51
64
  }
52
65
 
53
66
  } else if (meta.switchState == SwitchStateStage) {
@@ -58,7 +71,7 @@ void handleException(NSException *exception) {
58
71
 
59
72
  [[StallionEventHandler sharedInstance] cacheEvent:StallionObjConstants.exception_stage_event
60
73
  eventPayload:@{
61
- @"meta": readableError,
74
+ @"meta": errorString,
62
75
  StallionObjConstants.release_hash_key: meta.stageNewHash,
63
76
  StallionObjConstants.is_auto_rollback_key: isAutoRollback ? @"true" : @"false"
64
77
  }];
@@ -67,7 +80,7 @@ void handleException(NSException *exception) {
67
80
  UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Stallion Exception Handler"
68
81
  message:[NSString stringWithFormat:@"%@\n%@",
69
82
  @"A crash occurred in the app. Build was rolled back. Check crash report below. Continue crash to invoke other exception handlers. \n \n",
70
- readableError]
83
+ errorString]
71
84
  preferredStyle:UIAlertControllerStyleAlert];
72
85
 
73
86
  [alert addAction:[UIAlertAction actionWithTitle:@"Continue Crash"
@@ -89,11 +102,83 @@ void handleException(NSException *exception) {
89
102
  }
90
103
  }
91
104
 
92
- // Call default exception handler if available
105
+ if (meta.switchState == SwitchStateProd) {
106
+ NSString *currentHash = [meta getActiveReleaseHash] ?: @"";
107
+
108
+ [[StallionEventHandler sharedInstance] cacheEvent:StallionObjConstants.exception_prod_event
109
+ eventPayload:@{
110
+ @"meta": errorString,
111
+ StallionObjConstants.release_hash_key: currentHash,
112
+ StallionObjConstants.is_auto_rollback_key: isAutoRollback ? @"true" : @"false"
113
+ }];
114
+ if (isAutoRollback) {
115
+ [StallionSlotManager rollbackProdWithAutoRollback:YES errorString:errorString];
116
+ }
117
+
118
+ } else if (meta.switchState == SwitchStateStage) {
119
+
120
+ if(isAutoRollback) {
121
+ [StallionSlotManager rollbackStage];
122
+ }
123
+
124
+ [[StallionEventHandler sharedInstance] cacheEvent:StallionObjConstants.exception_stage_event
125
+ eventPayload:@{
126
+ @"meta": errorString,
127
+ StallionObjConstants.release_hash_key: meta.stageNewHash,
128
+ StallionObjConstants.is_auto_rollback_key: isAutoRollback ? @"true" : @"false"
129
+ }];
130
+
131
+ if(!exceptionAlertDismissed) {
132
+ UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Stallion Exception Handler"
133
+ message:[NSString stringWithFormat:@"%@\n%@",
134
+ @"A crash occurred in the app. Build was rolled back. Check crash report below. Continue crash to invoke other exception handlers.\n\n",
135
+ errorString]
136
+ preferredStyle:UIAlertControllerStyleAlert];
137
+
138
+ [alert addAction:[UIAlertAction actionWithTitle:@"Continue Crash"
139
+ style:UIAlertActionStyleDefault
140
+ handler:^(UIAlertAction *action) {
141
+ exceptionAlertDismissed = TRUE;
142
+ }]];
143
+
144
+ UIApplication *app = [UIApplication sharedApplication];
145
+ UIViewController *rootViewController = app.delegate.window.rootViewController;
146
+
147
+ dispatch_async(dispatch_get_main_queue(), ^{
148
+ [rootViewController presentViewController:alert animated:YES completion:nil];
149
+ });
150
+
151
+ while (exceptionAlertDismissed == FALSE) {
152
+ [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
153
+ }
154
+ }
155
+ }
156
+ }
157
+
158
+ void handleException(NSException *exception) {
159
+ NSString *readableError = [exception reason] ?: @"Unknown exception";
160
+ performStallionRollback(readableError);
161
+
162
+ // Call default exception handler if available
93
163
  if (_defaultExceptionHandler) {
94
164
  _defaultExceptionHandler(exception);
95
165
  }
96
166
  }
97
167
 
98
- @end
168
+ void handleSignal(int signalVal) {
169
+ void *callstack[128];
170
+ int frames = backtrace(callstack, 128);
171
+ char **symbols = backtrace_symbols(callstack, frames);
172
+
173
+ NSMutableString *stackTrace = [NSMutableString stringWithFormat:@"Signal %d was raised.\n", signalVal];
174
+ for (int i = 0; i < frames; ++i) {
175
+ [stackTrace appendFormat:@"%s\n", symbols[i]];
176
+ }
177
+ free(symbols);
178
+
179
+ performStallionRollback(stackTrace);
99
180
 
181
+ // Restore default and raise to proceed with crash
182
+ signal(signalVal, SIG_DFL);
183
+ raise(signalVal);
184
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-stallion",
3
- "version": "2.3.0-alpha.1",
3
+ "version": "2.3.0-alpha.2",
4
4
  "description": "Offical React Native SDK for Stallion",
5
5
  "main": "index",
6
6
  "types": "types/index.d.ts",
@@ -94,9 +94,9 @@ export const useStallionEvents = (refreshMeta, setProgress, configState) => {
94
94
  };
95
95
  }, [refreshMeta, setProgress, popEventsDebounced]);
96
96
  useEffect(() => {
97
- requestAnimationFrame(() => {
97
+ setTimeout(() => {
98
98
  onLaunchNative('Success');
99
- });
99
+ }, 100);
100
100
  }, []);
101
101
  useEffect(() => {
102
102
  popEventsDebounced();
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useCallback","useMemo","NativeEventEmitter","NativeEventTypesProd","STALLION_NATIVE_EVENT","NativeEventTypesStage","stallionEventEmitter","acknowledgeEventsNative","onLaunchNative","popEventsNative","StallionNativeModule","useApiClient","API_PATHS","debounce","REFRESH_META_EVENTS","DOWNLOAD_COMPLETE_PROD","ROLLED_BACK_PROD","AUTO_ROLLED_BACK_PROD","STABILIZED_PROD","DOWNLOAD_COMPLETE_STAGE","DOWNLOAD_ERROR_STAGE","INSTALLED_STAGE","STALLION_EVENT_DEBOUNCE_INTERVAL","processStallionEvent","eventString","JSON","parse","_","useStallionEvents","refreshMeta","setProgress","configState","getData","syncStallionEvents","stallionEvents","projectId","LOG_EVENTS","eventData","then","res","success","eventIds","map","event","eventId","eventIdString","stringify","popEvents","eventsString","eventsArr","length","requestAnimationFrame","popEventsDebounced","eventEmitter","addListener","nativeEventString","eventType","type","DOWNLOAD_STARTED_PROD","DOWNLOAD_ERROR_PROD","INSTALLED_PROD","SYNC_ERROR_PROD","EXCEPTION_PROD","emit","DOWNLOAD_PROGRESS_STAGE","progress","Number","removeAllListeners"],"sourceRoot":"../../../../src","sources":["main/state/useStallionEvents.ts"],"mappings":"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"}
1
+ {"version":3,"names":["useEffect","useCallback","useMemo","NativeEventEmitter","NativeEventTypesProd","STALLION_NATIVE_EVENT","NativeEventTypesStage","stallionEventEmitter","acknowledgeEventsNative","onLaunchNative","popEventsNative","StallionNativeModule","useApiClient","API_PATHS","debounce","REFRESH_META_EVENTS","DOWNLOAD_COMPLETE_PROD","ROLLED_BACK_PROD","AUTO_ROLLED_BACK_PROD","STABILIZED_PROD","DOWNLOAD_COMPLETE_STAGE","DOWNLOAD_ERROR_STAGE","INSTALLED_STAGE","STALLION_EVENT_DEBOUNCE_INTERVAL","processStallionEvent","eventString","JSON","parse","_","useStallionEvents","refreshMeta","setProgress","configState","getData","syncStallionEvents","stallionEvents","projectId","LOG_EVENTS","eventData","then","res","success","eventIds","map","event","eventId","eventIdString","stringify","popEvents","eventsString","eventsArr","length","requestAnimationFrame","popEventsDebounced","eventEmitter","addListener","nativeEventString","eventType","type","DOWNLOAD_STARTED_PROD","DOWNLOAD_ERROR_PROD","INSTALLED_PROD","SYNC_ERROR_PROD","EXCEPTION_PROD","emit","DOWNLOAD_PROGRESS_STAGE","progress","Number","removeAllListeners","setTimeout"],"sourceRoot":"../../../../src","sources":["main/state/useStallionEvents.ts"],"mappings":"AAAA,SAASA,SAAS,EAAEC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AACvD,SAASC,kBAAkB,QAAQ,cAAc;AACjD,SACEC,oBAAoB,EACpBC,qBAAqB,EACrBC,qBAAqB,QAChB,2BAA2B;AAClC,SAASC,oBAAoB,QAAQ,+BAA+B;AACpE,SACEC,uBAAuB,EACvBC,cAAc,EACdC,eAAe,QACV,8BAA8B;AACrC,OAAOC,oBAAoB,MAAM,4BAA4B;AAE7D,SAASC,YAAY,QAAQ,uBAAuB;AACpD,SAASC,SAAS,QAAQ,2BAA2B;AACrD,OAAOC,QAAQ,MAAM,mBAAmB;AAExC,MAAMC,mBAEL,GAAG;EACF,CAACX,oBAAoB,CAACY,sBAAsB,GAAG,IAAI;EACnD,CAACZ,oBAAoB,CAACa,gBAAgB,GAAG,IAAI;EAC7C,CAACb,oBAAoB,CAACc,qBAAqB,GAAG,IAAI;EAClD,CAACd,oBAAoB,CAACe,eAAe,GAAG,IAAI;EAC5C,CAACb,qBAAqB,CAACc,uBAAuB,GAAG,IAAI;EACrD,CAACd,qBAAqB,CAACe,oBAAoB,GAAG,IAAI;EAClD,CAACf,qBAAqB,CAACgB,eAAe,GAAG;AAC3C,CAAC;AAWD,MAAMC,gCAAgC,GAAG,IAAI,CAAC,CAAC;;AAE/C,MAAMC,oBAAoB,GACxBC,WAAmB,IACiB;EACpC,IAAI;IACF,OAAOC,IAAI,CAACC,KAAK,CAACF,WAAW,CAAC;EAChC,CAAC,CAAC,OAAOG,CAAC,EAAE;IACV,OAAO,IAAI;EACb;AACF,CAAC;AAED,OAAO,MAAMC,iBAAiB,GAAGA,CAC/BC,WAAgC,EAChCC,WAA0C,EAC1CC,WAAgC,KAC7B;EACH,MAAM;IAAEC;EAAQ,CAAC,GAAGrB,YAAY,CAACoB,WAAW,CAAC;EAE7C,MAAME,kBAAkB,GAAGjC,WAAW,CACnCkC,cAA0C,IAAK;IAC9C,IAAIH,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEI,SAAS,EAAE;MAC1BH,OAAO,CAACpB,SAAS,CAACwB,UAAU,EAAE;QAC5BD,SAAS,EAAEJ,WAAW,CAACI,SAAS;QAChCE,SAAS,EAAEH;MACb,CAAC,CAAC,CAACI,IAAI,CAAEC,GAAG,IAAK;QACf,IAAIA,GAAG,aAAHA,GAAG,eAAHA,GAAG,CAAEC,OAAO,EAAE;UAChB,IAAI;YACF,MAAMC,QAAQ,GAAGP,cAAc,CAACQ,GAAG,CAAEC,KAAK,IAAKA,KAAK,CAACC,OAAO,CAAC;YAC7D,MAAMC,aAAa,GAAGpB,IAAI,CAACqB,SAAS,CAACL,QAAQ,CAAC;YAC9ClC,uBAAuB,CAACsC,aAAa,CAAC;UACxC,CAAC,CAAC,OAAOlB,CAAC,EAAE,CAAC;QACf;MACF,CAAC,CAAC;IACJ;EACF,CAAC,EACD,CAACK,OAAO,EAAED,WAAW,CACvB,CAAC;EAED,MAAMgB,SAAS,GAAG/C,WAAW,CAAC,MAAM;IAClCS,eAAe,CAAC,CAAC,CAAC6B,IAAI,CAAEU,YAAoB,IAAK;MAC/C,IAAI;QACF,MAAMC,SAAqC,GAAGxB,IAAI,CAACC,KAAK,CAACsB,YAAY,CAAC;QACtE,IAAIC,SAAS,aAATA,SAAS,eAATA,SAAS,CAAEC,MAAM,EAAE;UACrBjB,kBAAkB,CAACgB,SAAS,CAAC;UAC7BE,qBAAqB,CAACtB,WAAW,CAAC;QACpC;MACF,CAAC,CAAC,OAAOF,CAAC,EAAE,CAAC;IACf,CAAC,CAAC;EACJ,CAAC,EAAE,CAACM,kBAAkB,EAAEJ,WAAW,CAAC,CAAC;EAErC,MAAMuB,kBAAkB,GAAGnD,OAAO,CAChC,MAAMY,QAAQ,CAACkC,SAAS,EAAEzB,gCAAgC,CAAC,EAC3D,CAACyB,SAAS,CACZ,CAAC;EAEDhD,SAAS,CAAC,MAAM;IACd,MAAMsD,YAAY,GAAG,IAAInD,kBAAkB,CAACQ,oBAAoB,CAAC;IACjE2C,YAAY,CAACC,WAAW,CACtBlD,qBAAqB,EACpBmD,iBAAyB,IAAK;MAC7B,MAAMlB,SAAS,GAAGd,oBAAoB,CAACgC,iBAAiB,CAAC;MACzD,IAAI,CAAClB,SAAS,EAAE;MAEhB,MAAMmB,SAAS,GAAGnB,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEoB,IAAc;MAC3C,IAAI3C,mBAAmB,CAAC0C,SAAS,CAAC,EAAE;QAClCL,qBAAqB,CAACtB,WAAW,CAAC;QAClCuB,kBAAkB,CAAC,CAAC;MACtB;MACA,QAAQI,SAAS;QACf,KAAKrD,oBAAoB,CAACuD,qBAAqB;QAC/C,KAAKvD,oBAAoB,CAACY,sBAAsB;QAChD,KAAKZ,oBAAoB,CAACwD,mBAAmB;QAC7C,KAAKxD,oBAAoB,CAACyD,cAAc;QACxC,KAAKzD,oBAAoB,CAAC0D,eAAe;QACzC,KAAK1D,oBAAoB,CAACa,gBAAgB;QAC1C,KAAKb,oBAAoB,CAACe,eAAe;QACzC,KAAKf,oBAAoB,CAAC2D,cAAc;QACxC,KAAK3D,oBAAoB,CAACc,qBAAqB;UAC7CX,oBAAoB,CAACyD,IAAI,CAAC1B,SAAS,CAAC;UACpC;QACF,KAAKhC,qBAAqB,CAAC2D,uBAAuB;UAChD,IAAI;YACF,MAAMC,QAAQ,GAAGC,MAAM,CAAC7B,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAE4B,QAAQ,CAAC;YAC5C,IAAIA,QAAQ,EAAE;cACZnC,WAAW,CAACmC,QAAQ,CAAC;YACvB;UACF,CAAC,CAAC,OAAOtC,CAAC,EAAE,CAAC;UACb;MACJ;IACF,CACF,CAAC;IACD,OAAO,MAAM;MACX0B,YAAY,CAACc,kBAAkB,CAAC/D,qBAAqB,CAAC;IACxD,CAAC;EACH,CAAC,EAAE,CAACyB,WAAW,EAAEC,WAAW,EAAEsB,kBAAkB,CAAC,CAAC;EAElDrD,SAAS,CAAC,MAAM;IACdqE,UAAU,CAAC,MAAM;MACf5D,cAAc,CAAC,SAAS,CAAC;IAC3B,CAAC,EAAE,GAAG,CAAC;EACT,CAAC,EAAE,EAAE,CAAC;EAENT,SAAS,CAAC,MAAM;IACdqD,kBAAkB,CAAC,CAAC;EACtB,CAAC,EAAE,CAACA,kBAAkB,CAAC,CAAC;AAC1B,CAAC"}