@uploadista/expo 0.0.15-beta.3 → 0.0.15-beta.4

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/dist/index.d.mts CHANGED
@@ -3,8 +3,11 @@ import { Base64Service, Base64Service as Base64Service$1, ConnectionPoolConfig,
3
3
  import { CameraOptions, CameraOptions as CameraOptions$1, FileInfo, FileInfo as FileInfo$1, FilePickResult, FilePickResult as FilePickResult$1, FileSystemProvider, FileSystemProvider as FileSystemProvider$1, PickerOptions, PickerOptions as PickerOptions$1, ReactNativeUploadInput } from "@uploadista/react-native-core";
4
4
  import React from "react";
5
5
  import * as react_jsx_runtime0 from "react/jsx-runtime";
6
+ import { FlowEvent, FlowEventFlowCancel, FlowEventFlowEnd, FlowEventFlowError, FlowEventFlowPause, FlowEventFlowStart, FlowEventJobEnd, FlowEventJobStart, FlowEventNodeEnd, FlowEventNodeError, FlowEventNodePause, FlowEventNodeResume, FlowEventNodeStart } from "@uploadista/core/flow";
7
+ import { UploadEvent } from "@uploadista/core/types";
6
8
  import * as _uploadista_core0 from "@uploadista/core";
7
9
  import { UploadistaContextType } from "@uploadista/react-native-core/hooks";
10
+ import { UploadistaEvent } from "@uploadista/client-browser";
8
11
 
9
12
  //#region src/types/upload-input.d.ts
10
13
  /**
@@ -277,10 +280,9 @@ declare function useUploadistaClient(options: UseUploadistaClientOptions): UseUp
277
280
  * @property baseUrl - API base URL for uploads
278
281
  * @property storageId - Default storage identifier
279
282
  * @property chunkSize - Upload chunk size in bytes
280
- * @property onEvent - Global event handler for all upload events
281
283
  * @property ... - All other UploadistaClientOptions
282
284
  */
283
- interface UploadistaProviderProps extends UseUploadistaClientOptions {
285
+ interface UploadistaProviderProps extends Omit<UseUploadistaClientOptions, "onEvent"> {
284
286
  /**
285
287
  * Children components that will have access to the upload client
286
288
  */
@@ -303,9 +305,6 @@ interface UploadistaProviderProps extends UseUploadistaClientOptions {
303
305
  * baseUrl="https://api.example.com"
304
306
  * storageId="my-storage"
305
307
  * chunkSize={1024 * 1024} // 1MB chunks
306
- * onEvent={(event) => {
307
- * console.log('Global upload event:', event);
308
- * }}
309
308
  * >
310
309
  * <UploadInterface />
311
310
  * </UploadistaProvider>
@@ -367,6 +366,253 @@ declare function UploadistaProvider({
367
366
  */
368
367
  declare function useUploadistaContext(): UploadistaContextType;
369
368
  //#endregion
369
+ //#region src/hooks/event-utils.d.ts
370
+ /**
371
+ * Type guard to check if an event is a flow event
372
+ */
373
+ declare function isFlowEvent(event: UploadistaEvent): event is FlowEvent;
374
+ /**
375
+ * Type guard to check if an event is an upload event
376
+ */
377
+ declare function isUploadEvent(event: UploadistaEvent): event is UploadEvent;
378
+ //#endregion
379
+ //#region src/hooks/use-uploadista-events.d.ts
380
+ /**
381
+ * Simple hook that subscribes to all Uploadista events (both flow and upload events).
382
+ *
383
+ * This is a low-level hook that provides access to all events. For more structured
384
+ * event handling, consider using `useFlowEvents` or `useUploadEvents` instead.
385
+ *
386
+ * Must be used within UploadistaProvider.
387
+ *
388
+ * @param callback - Function called for every event emitted by the Uploadista client
389
+ *
390
+ * @example
391
+ * ```tsx
392
+ * import { useUploadistaEvents, isFlowEvent, isUploadEvent } from '@uploadista/expo';
393
+ *
394
+ * function MyComponent() {
395
+ * useUploadistaEvents((event) => {
396
+ * if (isFlowEvent(event)) {
397
+ * console.log('Flow event:', event.eventType);
398
+ * } else if (isUploadEvent(event)) {
399
+ * console.log('Upload event:', event.type);
400
+ * }
401
+ * });
402
+ *
403
+ * return <View><Text>Listening to all events...</Text></View>;
404
+ * }
405
+ * ```
406
+ */
407
+ declare function useUploadistaEvents(callback: (event: UploadistaEvent) => void): void;
408
+ //#endregion
409
+ //#region src/hooks/use-flow-events.d.ts
410
+ /**
411
+ * Options for handling flow execution events.
412
+ *
413
+ * All callbacks are optional - only provide handlers for events you care about.
414
+ */
415
+ interface UseFlowEventsOptions {
416
+ /** Called when a job starts execution */
417
+ onJobStart?: (event: FlowEventJobStart) => void;
418
+ /** Called when a job completes (success or failure) */
419
+ onJobEnd?: (event: FlowEventJobEnd) => void;
420
+ /** Called when a flow begins execution */
421
+ onFlowStart?: (event: FlowEventFlowStart) => void;
422
+ /** Called when a flow completes successfully */
423
+ onFlowEnd?: (event: FlowEventFlowEnd) => void;
424
+ /** Called when a flow encounters an error */
425
+ onFlowError?: (event: FlowEventFlowError) => void;
426
+ /** Called when a flow is paused by user request */
427
+ onFlowPause?: (event: FlowEventFlowPause) => void;
428
+ /** Called when a flow is cancelled by user request */
429
+ onFlowCancel?: (event: FlowEventFlowCancel) => void;
430
+ /** Called when a node starts processing */
431
+ onNodeStart?: (event: FlowEventNodeStart) => void;
432
+ /** Called when a node completes successfully */
433
+ onNodeEnd?: (event: FlowEventNodeEnd) => void;
434
+ /** Called when a node pauses (waiting for additional data) */
435
+ onNodePause?: (event: FlowEventNodePause) => void;
436
+ /** Called when a paused node resumes execution */
437
+ onNodeResume?: (event: FlowEventNodeResume) => void;
438
+ /** Called when a node encounters an error */
439
+ onNodeError?: (event: FlowEventNodeError) => void;
440
+ }
441
+ /**
442
+ * Structured hook for handling flow execution events with type-safe callbacks.
443
+ *
444
+ * This hook provides a clean API for listening to specific flow events without
445
+ * needing to manually filter events or use type guards.
446
+ *
447
+ * Must be used within UploadistaProvider.
448
+ *
449
+ * @param options - Object with optional callbacks for each flow event type
450
+ *
451
+ * @example
452
+ * ```tsx
453
+ * import { useFlowEvents } from '@uploadista/expo';
454
+ * import { View, Text } from 'react-native';
455
+ *
456
+ * function FlowMonitor() {
457
+ * useFlowEvents({
458
+ * onFlowStart: (event) => {
459
+ * console.log('Flow started:', event.flowId);
460
+ * },
461
+ * onNodeStart: (event) => {
462
+ * console.log('Node started:', event.nodeName);
463
+ * },
464
+ * onNodeEnd: (event) => {
465
+ * console.log('Node completed:', event.nodeName, event.result);
466
+ * },
467
+ * onFlowEnd: (event) => {
468
+ * console.log('Flow completed with outputs:', event.outputs);
469
+ * },
470
+ * onFlowError: (event) => {
471
+ * console.error('Flow failed:', event.error);
472
+ * },
473
+ * });
474
+ *
475
+ * return <View><Text>Monitoring flow execution...</Text></View>;
476
+ * }
477
+ * ```
478
+ */
479
+ declare function useFlowEvents(options: UseFlowEventsOptions): void;
480
+ //#endregion
481
+ //#region src/hooks/use-upload-events.d.ts
482
+ /**
483
+ * Upload progress event data
484
+ */
485
+ interface UploadProgressEventData {
486
+ id: string;
487
+ progress: number;
488
+ total: number;
489
+ flow?: {
490
+ flowId: string;
491
+ nodeId: string;
492
+ jobId: string;
493
+ };
494
+ }
495
+ /**
496
+ * Upload started/complete event data (contains full UploadFile)
497
+ */
498
+ interface UploadFileEventData {
499
+ [key: string]: unknown;
500
+ flow?: {
501
+ flowId: string;
502
+ nodeId: string;
503
+ jobId: string;
504
+ };
505
+ }
506
+ /**
507
+ * Upload failed event data
508
+ */
509
+ interface UploadFailedEventData {
510
+ id: string;
511
+ error: string;
512
+ flow?: {
513
+ flowId: string;
514
+ nodeId: string;
515
+ jobId: string;
516
+ };
517
+ }
518
+ /**
519
+ * Upload validation success event data
520
+ */
521
+ interface UploadValidationSuccessEventData {
522
+ id: string;
523
+ validationType: "checksum" | "mimetype";
524
+ algorithm?: string;
525
+ flow?: {
526
+ flowId: string;
527
+ nodeId: string;
528
+ jobId: string;
529
+ };
530
+ }
531
+ /**
532
+ * Upload validation failed event data
533
+ */
534
+ interface UploadValidationFailedEventData {
535
+ id: string;
536
+ reason: string;
537
+ expected: string;
538
+ actual: string;
539
+ flow?: {
540
+ flowId: string;
541
+ nodeId: string;
542
+ jobId: string;
543
+ };
544
+ }
545
+ /**
546
+ * Upload validation warning event data
547
+ */
548
+ interface UploadValidationWarningEventData {
549
+ id: string;
550
+ message: string;
551
+ flow?: {
552
+ flowId: string;
553
+ nodeId: string;
554
+ jobId: string;
555
+ };
556
+ }
557
+ /**
558
+ * Options for handling upload events.
559
+ *
560
+ * All callbacks are optional - only provide handlers for events you care about.
561
+ */
562
+ interface UseUploadEventsOptions {
563
+ /** Called when an upload starts */
564
+ onUploadStarted?: (data: UploadFileEventData) => void;
565
+ /** Called with upload progress updates */
566
+ onUploadProgress?: (data: UploadProgressEventData) => void;
567
+ /** Called when an upload completes successfully */
568
+ onUploadComplete?: (data: UploadFileEventData) => void;
569
+ /** Called when an upload fails */
570
+ onUploadFailed?: (data: UploadFailedEventData) => void;
571
+ /** Called when upload validation succeeds */
572
+ onUploadValidationSuccess?: (data: UploadValidationSuccessEventData) => void;
573
+ /** Called when upload validation fails */
574
+ onUploadValidationFailed?: (data: UploadValidationFailedEventData) => void;
575
+ /** Called when upload validation produces a warning */
576
+ onUploadValidationWarning?: (data: UploadValidationWarningEventData) => void;
577
+ }
578
+ /**
579
+ * Structured hook for handling upload events with type-safe callbacks.
580
+ *
581
+ * This hook provides a clean API for listening to specific upload events without
582
+ * needing to manually filter events or use type guards.
583
+ *
584
+ * Must be used within UploadistaProvider.
585
+ *
586
+ * @param options - Object with optional callbacks for each upload event type
587
+ *
588
+ * @example
589
+ * ```tsx
590
+ * import { useUploadEvents } from '@uploadista/expo';
591
+ * import { View, Text } from 'react-native';
592
+ *
593
+ * function UploadMonitor() {
594
+ * useUploadEvents({
595
+ * onUploadStarted: (data) => {
596
+ * console.log('Upload started:', data.id);
597
+ * },
598
+ * onUploadProgress: (data) => {
599
+ * const percent = (data.progress / data.total) * 100;
600
+ * console.log(`Upload progress: ${percent}%`);
601
+ * },
602
+ * onUploadComplete: (data) => {
603
+ * console.log('Upload completed:', data);
604
+ * },
605
+ * onUploadFailed: (data) => {
606
+ * console.error('Upload failed:', data.error);
607
+ * },
608
+ * });
609
+ *
610
+ * return <View><Text>Monitoring uploads...</Text></View>;
611
+ * }
612
+ * ```
613
+ */
614
+ declare function useUploadEvents(options: UseUploadEventsOptions): void;
615
+ //#endregion
370
616
  //#region src/services/base64-service.d.ts
371
617
  /**
372
618
  * Expo-specific implementation of Base64Service using js-base64 library
@@ -452,5 +698,5 @@ declare class ExpoFileSystemProvider implements FileSystemProvider$1 {
452
698
  getFileInfo(uri: string): Promise<FileInfo$1>;
453
699
  }
454
700
  //#endregion
455
- export { type Base64Service, type CameraOptions, type ConnectionPoolConfig, ExpoFileSystemProvider, type ExpoServiceOptions, type FileInfo, type FilePickResult, type FileReaderService, type FileSource, type FileSystemProvider, type HttpClient, type HttpRequestOptions, type HttpResponse, type IdGenerationService, type PickerOptions, type ServiceContainer, type SliceResult, type StorageService, type UploadistaClientOptions, UploadistaProvider, type UploadistaProviderProps, type UseUploadistaClientOptions, type UseUploadistaClientReturn, createAsyncStorageService, createExpoBase64Service, createExpoFileReaderService, createExpoHttpClient, createExpoIdGenerationService, createExpoServices, createUploadistaClient, useUploadistaClient, useUploadistaContext };
701
+ export { type Base64Service, type CameraOptions, type ConnectionPoolConfig, ExpoFileSystemProvider, type ExpoServiceOptions, type FileInfo, type FilePickResult, type FileReaderService, type FileSource, type FileSystemProvider, type HttpClient, type HttpRequestOptions, type HttpResponse, type IdGenerationService, type PickerOptions, type ServiceContainer, type SliceResult, type StorageService, type UploadFailedEventData, type UploadFileEventData, type UploadProgressEventData, type UploadValidationFailedEventData, type UploadValidationSuccessEventData, type UploadValidationWarningEventData, type UploadistaClientOptions, UploadistaProvider, type UploadistaProviderProps, type UseFlowEventsOptions, type UseUploadEventsOptions, type UseUploadistaClientOptions, type UseUploadistaClientReturn, createAsyncStorageService, createExpoBase64Service, createExpoFileReaderService, createExpoHttpClient, createExpoIdGenerationService, createExpoServices, createUploadistaClient, isFlowEvent, isUploadEvent, useFlowEvents, useUploadEvents, useUploadistaClient, useUploadistaContext, useUploadistaEvents };
456
702
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/upload-input.ts","../src/client/create-uploadista-client.ts","../src/hooks/use-uploadista-client.ts","../src/components/uploadista-provider.tsx","../src/services/base64-service.ts","../src/services/create-expo-services.ts","../src/services/file-reader-service.ts","../src/services/http-client.ts","../src/services/id-generation-service.ts","../src/services/storage-service.ts","../src/services/expo-file-system-provider.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;KAKY,eAAA,GAAkB,OAAO;;;;;UCKpB,uBAAA,SACP,KACN,0BAA4B;sBAaV;;;;;;EDpBV,eAAA,CAAA,EAAe,OAAA;;;;ACK3B;;;;;;AA2CA;;;;;;;;;;iBAAgB,sBAAA,UAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC/B/B,eAAA,EAAA,GAAA,UAA2B,yCAAQ;AAapD,CAAA;;;;;;;;;;;AF9BA;;;;ACKA;;;;AACU,UCWO,0BAAA,SAAmC,uBDX1C,CAAA;EAAI;AA0Cd;;YC3BY;;;;;;;;UASK,yBAAA;;;;UAIP,kBAAkB;;;;UAKlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmEM,mBAAA,UACL,6BACR;;;;;;;;;AF5GH;;;;ACKA;AAEgC,UEWf,uBAAA,SAAgC,0BFXjB,CAAA;EAA5B;;;EADU,QAAA,EEgBF,KAAA,CAAM,SFhBJ;AA0Cd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBEsBgB,kBAAA;;;GAGb,0BAAuB,kBAAA,CAAA,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoGV,oBAAA,CAAA,GAAwB;;;;;;;iBC3KxB,uBAAA,CAAA,GAA2B;;;UCU1B,kBAAA;;;;sBAIK;;;ALhBtB;;;;ACKA;;;;;;AA2CA;;;;;;;;;;;;;;;iBIFgB,kBAAA,WACL,qBACR,mBAAiB;;;;;;;iBC1CJ,2BAAA,CAAA,GAA+B,oBAAkB;;;;;;;iBCKjD,oBAAA,UACL,yBACR;;;;;;;iBCXa,6BAAA,CAAA,GAAiC;;;;;;;iBCDjC,yBAAA,CAAA,GAA6B;;;;;;;cCShC,sBAAA,YAAkC;yBAChB,kBAAgB,QAAQ;sBA8C3B,kBAAgB,QAAQ;sBAiDxB,kBAAgB,QAAQ;EV1GxC,UAAA,CAAA,OAAkB,CAAH,EU0JE,eV1JC,CAAA,EU0Je,OV1JJ,CU0JY,gBV1JZ,CAAA;yBU0MV,QAAQ;oCAgBG;4BAKR,QAAQ;AT1N1C"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/upload-input.ts","../src/client/create-uploadista-client.ts","../src/hooks/use-uploadista-client.ts","../src/components/uploadista-provider.tsx","../src/hooks/event-utils.ts","../src/hooks/use-uploadista-events.ts","../src/hooks/use-flow-events.ts","../src/hooks/use-upload-events.ts","../src/services/base64-service.ts","../src/services/create-expo-services.ts","../src/services/file-reader-service.ts","../src/services/http-client.ts","../src/services/id-generation-service.ts","../src/services/storage-service.ts","../src/services/expo-file-system-provider.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{createRequire as e}from"node:module";import{createClientStorage as t,createInMemoryStorageService as n,createLogger as r,createUploadistaClient as i}from"@uploadista/client-core";import{fromBase64 as a,toBase64 as o}from"js-base64";import*as s from"expo-crypto";import*as c from"expo-file-system";import l from"@react-native-async-storage/async-storage";import{FlowManagerProvider as u,UploadistaContext as d}from"@uploadista/react-native-core";import{useCallback as f,useContext as p,useMemo as m,useRef as h}from"react";import*as g from"expo-document-picker";import*as _ from"expo-image-picker";import{jsx as v}from"react/jsx-runtime";var y=e(import.meta.url),b=class{native;constructor(){this.native=new AbortController}get signal(){return this.native.signal}abort(e){this.native.abort()}};const x=()=>({create:()=>new b});function S(){return{toBase64(e){let t=new Uint8Array(e);return o(Array.from(t).map(e=>String.fromCharCode(e)).join(``))},fromBase64(e){let t=a(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n.buffer}}}async function C(e){try{let t=await s.digest(s.CryptoDigestAlgorithm.SHA256,e);return Array.from(new Uint8Array(t)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}catch(e){throw Error(`Failed to compute checksum: ${e instanceof Error?e.message:`Unknown error`}`)}}async function w(e){try{return C(await T(e))}catch(e){throw Error(`Failed to compute file checksum: ${e instanceof Error?e.message:`Unknown error`}`)}}async function T(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{r.result instanceof ArrayBuffer?t(new Uint8Array(r.result)):n(Error(`FileReader result is not an ArrayBuffer`))},r.onerror=()=>n(r.error),r.readAsArrayBuffer(e)})}function E(){return{computeChecksum:async e=>C(e)}}function D(){return{async openFile(e,t){if(e instanceof Blob)return O(e);if(typeof e==`string`||e&&typeof e==`object`&&`uri`in e)return A(typeof e==`string`?e:e.uri);throw Error(`Unsupported file input type for Expo. Expected Blob, File, URI string, or {uri: string}`)}}}function O(e){return{input:e,size:e.size,async slice(t,n){let r=e.slice(t,n),i=await k(r);return{done:n>=e.size,value:new Uint8Array(i),size:r.size}},close(){},name:null,lastModified:null,type:null}}function k(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{r.result instanceof ArrayBuffer?t(r.result):n(Error(`FileReader result is not an ArrayBuffer`))},r.onerror=()=>n(r.error),r.readAsArrayBuffer(e)})}function A(e){let t=null,n=null;return{input:e,size:n,async slice(r,i){if(!t)try{let r=await j(),i=await r.getInfoAsync(e);if(!i.exists)throw Error(`File does not exist at URI: ${e}`);n=i.size??0;let a=M(await r.readAsStringAsync(e,{encoding:r.EncodingType.Base64}));n=a.length,t=new Blob([a.buffer])}catch(t){throw Error(`Failed to read file from URI ${e}: ${t}`)}let a=t.slice(r,i),o=await k(a);return{done:i>=t.size,value:new Uint8Array(o),size:a.size}},close(){t=null,n=null},name:e,lastModified:null,type:null}}async function j(){try{return y(`expo-file-system`)}catch{throw Error(`expo-file-system is required but not installed. Please install it with: npx expo install expo-file-system`)}}function M(e){let{fromBase64:t}=y(`js-base64`),n=t(e),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}function N(){return{computeFingerprint:async(e,t)=>{if(e instanceof Blob)return w(e);if(typeof e==`string`||e&&typeof e==`object`&&`uri`in e)return P(typeof e==`string`?e:e.uri);throw Error(`Unsupported file input type for fingerprinting. Expected Blob, File, URI string, or {uri: string}`)}}}async function P(e){try{let t=await F();if(!(await t.getInfoAsync(e)).exists)throw Error(`File does not exist at URI: ${e}`);let n=I(await t.readAsStringAsync(e,{encoding:t.EncodingType.Base64})),r=await s.digest(s.CryptoDigestAlgorithm.SHA256,n);return Array.from(new Uint8Array(r)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}catch(t){throw Error(`Failed to compute fingerprint from URI ${e}: ${t instanceof Error?t.message:`Unknown error`}`)}}async function F(){try{return y(`expo-file-system`)}catch{throw Error(`expo-file-system is required for URI-based fingerprinting. Please install it with: npx expo install expo-file-system`)}}function I(e){let{fromBase64:t}=y(`js-base64`),n=t(e),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}function L(e){return new R(e)}var R=class{metrics;connectionTimes=[];requestCount=0;errorCount=0;timeoutCount=0;retryCount=0;startTime=Date.now();constructor(e={}){this.metrics={activeConnections:0,totalConnections:0,reuseRate:0,averageConnectionTime:0}}async request(e,t={}){this.requestCount++;let n={method:t.method||`GET`,headers:t.headers,body:t.body,signal:t.signal};t.credentials&&(n.credentials=t.credentials);let r=Date.now();try{let i=t.timeout?new Promise((e,n)=>{setTimeout(()=>{this.timeoutCount++,n(Error(`Request timeout after ${t.timeout}ms`))},t.timeout)}):null,a=fetch(e,n),o=i?await Promise.race([a,i]):await a,s=Date.now()-r;return this.connectionTimes.push(s),this.metrics.totalConnections++,this.updateMetrics(),this.adaptResponse(o)}catch(e){throw this.errorCount++,e}}adaptResponse(e){return{status:e.status,statusText:e.statusText,headers:{get:t=>e.headers.get(t),has:t=>e.headers.has(t),forEach:t=>{e.headers.forEach(t)}},ok:e.ok,json:()=>e.json(),text:()=>e.text(),arrayBuffer:()=>e.arrayBuffer()}}updateMetrics(){if(this.connectionTimes.length>0){let e=this.connectionTimes.reduce((e,t)=>e+t,0);this.metrics.averageConnectionTime=e/this.connectionTimes.length}let e=this.connectionTimes.filter(e=>e<100).length;this.metrics.reuseRate=this.connectionTimes.length>0?e/this.connectionTimes.length:0}getMetrics(){return{...this.metrics}}getDetailedMetrics(){let e=Date.now()-this.startTime,t=e>0?this.requestCount/(e/1e3):0,n=this.requestCount>0?this.errorCount/this.requestCount:0,r=this.connectionTimes.filter(e=>e<100).length,i=this.connectionTimes.length-r,a=this.calculateHealth(n),o={supported:!1,detected:!1,version:`h1.1`,multiplexingActive:!1};return{...this.metrics,health:a,requestsPerSecond:t,errorRate:n,timeouts:this.timeoutCount,retries:this.retryCount,fastConnections:r,slowConnections:i,http2Info:o}}calculateHealth(e){let t,n,r=[],i=[];return e>.1?(t=`poor`,n=30,r.push(`High error rate: ${(e*100).toFixed(1)}%`),i.push(`Check network connectivity`)):e>.05?(t=`degraded`,n=60,r.push(`Moderate error rate: ${(e*100).toFixed(1)}%`),i.push(`Monitor connection stability`)):(t=`healthy`,n=100),this.metrics.averageConnectionTime>1e3&&(r.push(`Slow connections: ${this.metrics.averageConnectionTime.toFixed(0)}ms avg`),i.push(`Check network conditions`),n=Math.min(n,70)),{status:t,score:n,issues:r,recommendations:i}}reset(){this.metrics={activeConnections:0,totalConnections:0,reuseRate:0,averageConnectionTime:0},this.connectionTimes=[],this.requestCount=0,this.errorCount=0,this.timeoutCount=0,this.retryCount=0,this.startTime=Date.now()}async close(){this.reset()}async warmupConnections(e){let t=e.map(e=>this.request(e,{method:`HEAD`}).catch(()=>{}));await Promise.all(t)}};function z(){return{generate(){return s.randomUUID()}}}function B(){return{setTimeout:(e,t)=>globalThis.setTimeout(e,t),clearTimeout:e=>{globalThis.clearTimeout(e)},isBrowser:()=>!1,isOnline:()=>!0,isFileLike:e=>typeof e==`object`&&!!e&&(`uri`in e||`name`in e),getFileName:e=>{if(typeof e==`object`&&e&&`name`in e)return e.name;if(typeof e==`object`&&e&&`uri`in e){let t=e.uri;if(t)return t.split(`/`).pop()}},getFileType:e=>{if(typeof e==`object`&&e&&`type`in e)return e.type},getFileSize:e=>{if(typeof e==`object`&&e&&`size`in e)return e.size},getFileLastModified:e=>{if(typeof e==`object`&&e&&`lastModified`in e)return e.lastModified}}}function V(){let e=async e=>{let t={},n=await l.getAllKeys();for(let r in n)if(r.startsWith(e)){let e=await l.getItem(r);e&&(t[r]=e)}return t};return{async getItem(e){try{return await l.getItem(e)}catch(t){return console.error(`AsyncStorage getItem error for key ${e}:`,t),null}},async setItem(e,t){try{await l.setItem(e,t)}catch(t){throw console.error(`AsyncStorage setItem error for key ${e}:`,t),t}},async removeItem(e){try{await l.removeItem(e)}catch(t){throw console.error(`AsyncStorage removeItem error for key ${e}:`,t),t}},async findAll(){return e(``)},async find(t){return e(t)}}}var H=class{CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;readyState;onopen=null;onclose=null;onerror=null;onmessage=null;native;constructor(e){this.native=new WebSocket(e),this.readyState=this.native.readyState,this.native.onopen=()=>{this.readyState=this.native.readyState,this.onopen?.()},this.native.onclose=e=>{this.readyState=this.native.readyState,this.onclose?.({code:e.code??1e3,reason:e.reason??`undefined reason`})},this.native.onerror=e=>{this.onerror?.(e)},this.native.onmessage=e=>{this.onmessage?.({data:e.data})}}send(e){this.native.send(e)}close(e,t){this.native.close(e,t)}};const U=()=>({create:e=>new H(e)});function W(e={}){let{connectionPooling:t,useAsyncStorage:r=!0}=e;return{storage:r?V():n(),idGeneration:z(),httpClient:L(t),fileReader:D(),base64:S(),websocket:U(),abortController:x(),platform:B(),checksumService:E(),fingerprintService:N()}}function G(e){let n=W({connectionPooling:e.connectionPooling,useAsyncStorage:e.useAsyncStorage});return i({...e,webSocketFactory:n.websocket,abortControllerFactory:n.abortController,httpClient:n.httpClient,fileReader:n.fileReader,generateId:n.idGeneration,logger:r(!1,()=>{}),clientStorage:t(n.storage),checksumService:n.checksumService,fingerprintService:n.fingerprintService,platformService:n.platform})}function K(e){let t=h(e);return t.current=e,{client:m(()=>G({baseUrl:e.baseUrl,storageId:e.storageId,uploadistaBasePath:e.uploadistaBasePath,chunkSize:e.chunkSize,storeFingerprintForResuming:e.storeFingerprintForResuming,retryDelays:e.retryDelays,parallelUploads:e.parallelUploads,parallelChunkSize:e.parallelChunkSize,uploadStrategy:e.uploadStrategy,smartChunking:e.smartChunking,networkMonitoring:e.networkMonitoring,uploadMetrics:e.uploadMetrics,connectionPooling:e.connectionPooling,useAsyncStorage:e.useAsyncStorage,auth:e.auth,onEvent:e.onEvent}),[e.baseUrl,e.storageId,e.uploadistaBasePath,e.chunkSize,e.storeFingerprintForResuming,e.retryDelays,e.parallelUploads,e.parallelChunkSize,e.uploadStrategy,e.smartChunking,e.networkMonitoring,e.uploadMetrics,e.connectionPooling,e.useAsyncStorage,e.auth,e.onEvent]),config:e}}var q=class{async pickDocument(e){try{let t=await g.getDocumentAsync({type:e?.allowedTypes||[`*/*`],copyToCacheDirectory:!0});if(t.canceled)return{status:`cancelled`};let n=t.assets?.[0];return n?{status:`success`,data:{uri:n.uri,name:n.name,size:n.size||0,mimeType:n.mimeType}}:{status:`cancelled`}}catch(e){return{status:`error`,error:e instanceof Error?e:Error(`Failed to pick document: ${e instanceof Error?e.message:String(e)}`)}}}async pickImage(e){try{let{status:t}=await _.requestMediaLibraryPermissionsAsync();if(t!==`granted`)return{status:`error`,error:Error(`Camera roll permission not granted`)};let n=await _.launchImageLibraryAsync({mediaTypes:`images`,selectionLimit:e?.allowMultiple?0:1,quality:1});if(n.canceled)return{status:`cancelled`};let r=n.assets?.[0];return r?{status:`success`,data:{uri:r.uri,name:r.fileName||`image-${Date.now()}.jpg`,size:r.fileSize||0,mimeType:`image/jpeg`}}:{status:`cancelled`}}catch(e){return{status:`error`,error:e instanceof Error?e:Error(`Failed to pick image: ${e instanceof Error?e.message:String(e)}`)}}}async pickVideo(e){try{let{status:t}=await _.requestMediaLibraryPermissionsAsync();if(t!==`granted`)return{status:`error`,error:Error(`Camera roll permission not granted`)};let n=await _.launchImageLibraryAsync({mediaTypes:`videos`,selectionLimit:e?.allowMultiple?0:1});if(n.canceled)return{status:`cancelled`};let r=n.assets?.[0];return r?{status:`success`,data:{uri:r.uri,name:r.fileName||`video-${Date.now()}.mp4`,size:r.fileSize||0,mimeType:`video/mp4`}}:{status:`cancelled`}}catch(e){return{status:`error`,error:e instanceof Error?e:Error(`Failed to pick video: ${e instanceof Error?e.message:String(e)}`)}}}async pickCamera(e){try{let{status:t}=await _.requestCameraPermissionsAsync();if(t!==`granted`)return{status:`error`,error:Error(`Camera permission not granted`)};let n=await _.launchCameraAsync({allowsEditing:!1,aspect:[4,3],quality:e?.quality??1});if(n.canceled)return{status:`cancelled`};let r=n.assets?.[0];return r?{status:`success`,data:{uri:r.uri,name:r.fileName||`photo-${Date.now()}.jpg`,size:r.fileSize||0,mimeType:`image/jpeg`}}:{status:`cancelled`}}catch(e){return{status:`error`,error:e instanceof Error?e:Error(`Failed to capture photo: ${e instanceof Error?e.message:String(e)}`)}}}async readFile(e){try{let t=new c.File(e);if(!t.exists)throw Error(`File does not exist`);return(await t.bytes()).buffer}catch(e){throw Error(`Failed to read file: ${e instanceof Error?e.message:String(e)}`)}}async getDocumentUri(e){return e}async getFileInfo(e){try{let t=new c.File(e);if(!t.exists)throw Error(`File does not exist`);return{uri:e,name:e.split(`/`).pop()||`unknown`,size:t.size??0,modificationTime:t.modificationTime?t.modificationTime*1e3:void 0}}catch(e){throw Error(`Failed to get file info: ${e instanceof Error?e.message:String(e)}`)}}};function J({children:e,...t}){let n=h(new Set),r=m(()=>new q,[]),i=f(e=>{console.log(`[UploadistaProvider] Received event:`,e),t.onEvent?.(e),console.log(`[UploadistaProvider] Broadcasting to`,n.current.size,`subscribers`),n.current.forEach(t=>{try{t(e)}catch(e){console.error(`Error in event subscriber:`,e)}})},[t.onEvent]),a=K({...t,onEvent:i}),o=f(e=>(n.current.add(e),()=>{n.current.delete(e)}),[]),s=m(()=>({...a,fileSystemProvider:r,subscribeToEvents:o,config:a.config}),[a,r,o]);return v(d.Provider,{value:s,children:v(u,{children:e})})}function Y(){let e=p(d);if(e===void 0)throw Error(`useUploadistaContext must be used within an UploadistaProvider. Make sure to wrap your component tree with <UploadistaProvider>.`);return e}export{q as ExpoFileSystemProvider,J as UploadistaProvider,V as createAsyncStorageService,S as createExpoBase64Service,D as createExpoFileReaderService,L as createExpoHttpClient,z as createExpoIdGenerationService,W as createExpoServices,G as createUploadistaClient,K as useUploadistaClient,Y as useUploadistaContext};
1
+ import{createRequire as e}from"node:module";import{createClientStorage as t,createInMemoryStorageService as n,createLogger as r,createUploadistaClient as i}from"@uploadista/client-core";import{fromBase64 as a,toBase64 as o}from"js-base64";import*as s from"expo-crypto";import*as c from"expo-file-system";import l from"@react-native-async-storage/async-storage";import{FlowManagerProvider as u,UploadistaContext as d}from"@uploadista/react-native-core";import{useCallback as f,useContext as p,useEffect as m,useMemo as h,useRef as g}from"react";import*as _ from"expo-document-picker";import*as v from"expo-image-picker";import{jsx as y}from"react/jsx-runtime";import{EventType as b}from"@uploadista/core/flow";import{UploadEventType as x}from"@uploadista/core/types";var S=e(import.meta.url),C=class{native;constructor(){this.native=new AbortController}get signal(){return this.native.signal}abort(e){this.native.abort()}};const w=()=>({create:()=>new C});function T(){return{toBase64(e){let t=new Uint8Array(e);return o(Array.from(t).map(e=>String.fromCharCode(e)).join(``))},fromBase64(e){let t=a(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n.buffer}}}async function E(e){try{let t=await s.digest(s.CryptoDigestAlgorithm.SHA256,e);return Array.from(new Uint8Array(t)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}catch(e){throw Error(`Failed to compute checksum: ${e instanceof Error?e.message:`Unknown error`}`)}}async function D(e){try{return E(await O(e))}catch(e){throw Error(`Failed to compute file checksum: ${e instanceof Error?e.message:`Unknown error`}`)}}async function O(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{r.result instanceof ArrayBuffer?t(new Uint8Array(r.result)):n(Error(`FileReader result is not an ArrayBuffer`))},r.onerror=()=>n(r.error),r.readAsArrayBuffer(e)})}function k(){return{computeChecksum:async e=>E(e)}}function A(){return{async openFile(e,t){if(e instanceof Blob)return j(e);if(typeof e==`string`||e&&typeof e==`object`&&`uri`in e)return N(typeof e==`string`?e:e.uri);throw Error(`Unsupported file input type for Expo. Expected Blob, File, URI string, or {uri: string}`)}}}function j(e){return{input:e,size:e.size,async slice(t,n){let r=e.slice(t,n),i=await M(r);return{done:n>=e.size,value:new Uint8Array(i),size:r.size}},close(){},name:null,lastModified:null,type:null}}function M(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{r.result instanceof ArrayBuffer?t(r.result):n(Error(`FileReader result is not an ArrayBuffer`))},r.onerror=()=>n(r.error),r.readAsArrayBuffer(e)})}function N(e){let t=null,n=null;return{input:e,size:n,async slice(r,i){if(!t)try{let r=await ee(),i=await r.getInfoAsync(e);if(!i.exists)throw Error(`File does not exist at URI: ${e}`);n=i.size??0;let a=P(await r.readAsStringAsync(e,{encoding:r.EncodingType.Base64}));n=a.length,t=new Blob([a.buffer])}catch(t){throw Error(`Failed to read file from URI ${e}: ${t}`)}let a=t.slice(r,i),o=await M(a);return{done:i>=t.size,value:new Uint8Array(o),size:a.size}},close(){t=null,n=null},name:e,lastModified:null,type:null}}async function ee(){try{return S(`expo-file-system`)}catch{throw Error(`expo-file-system is required but not installed. Please install it with: npx expo install expo-file-system`)}}function P(e){let{fromBase64:t}=S(`js-base64`),n=t(e),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}function F(){return{computeFingerprint:async(e,t)=>{if(e instanceof Blob)return D(e);if(typeof e==`string`||e&&typeof e==`object`&&`uri`in e)return I(typeof e==`string`?e:e.uri);throw Error(`Unsupported file input type for fingerprinting. Expected Blob, File, URI string, or {uri: string}`)}}}async function I(e){try{let t=await L();if(!(await t.getInfoAsync(e)).exists)throw Error(`File does not exist at URI: ${e}`);let n=R(await t.readAsStringAsync(e,{encoding:t.EncodingType.Base64})),r=await s.digest(s.CryptoDigestAlgorithm.SHA256,n);return Array.from(new Uint8Array(r)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}catch(t){throw Error(`Failed to compute fingerprint from URI ${e}: ${t instanceof Error?t.message:`Unknown error`}`)}}async function L(){try{return S(`expo-file-system`)}catch{throw Error(`expo-file-system is required for URI-based fingerprinting. Please install it with: npx expo install expo-file-system`)}}function R(e){let{fromBase64:t}=S(`js-base64`),n=t(e),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}function z(e){return new B(e)}var B=class{metrics;connectionTimes=[];requestCount=0;errorCount=0;timeoutCount=0;retryCount=0;startTime=Date.now();constructor(e={}){this.metrics={activeConnections:0,totalConnections:0,reuseRate:0,averageConnectionTime:0}}async request(e,t={}){this.requestCount++;let n={method:t.method||`GET`,headers:t.headers,body:t.body,signal:t.signal};t.credentials&&(n.credentials=t.credentials);let r=Date.now();try{let i=t.timeout?new Promise((e,n)=>{setTimeout(()=>{this.timeoutCount++,n(Error(`Request timeout after ${t.timeout}ms`))},t.timeout)}):null,a=fetch(e,n),o=i?await Promise.race([a,i]):await a,s=Date.now()-r;return this.connectionTimes.push(s),this.metrics.totalConnections++,this.updateMetrics(),this.adaptResponse(o)}catch(e){throw this.errorCount++,e}}adaptResponse(e){return{status:e.status,statusText:e.statusText,headers:{get:t=>e.headers.get(t),has:t=>e.headers.has(t),forEach:t=>{e.headers.forEach(t)}},ok:e.ok,json:()=>e.json(),text:()=>e.text(),arrayBuffer:()=>e.arrayBuffer()}}updateMetrics(){if(this.connectionTimes.length>0){let e=this.connectionTimes.reduce((e,t)=>e+t,0);this.metrics.averageConnectionTime=e/this.connectionTimes.length}let e=this.connectionTimes.filter(e=>e<100).length;this.metrics.reuseRate=this.connectionTimes.length>0?e/this.connectionTimes.length:0}getMetrics(){return{...this.metrics}}getDetailedMetrics(){let e=Date.now()-this.startTime,t=e>0?this.requestCount/(e/1e3):0,n=this.requestCount>0?this.errorCount/this.requestCount:0,r=this.connectionTimes.filter(e=>e<100).length,i=this.connectionTimes.length-r,a=this.calculateHealth(n),o={supported:!1,detected:!1,version:`h1.1`,multiplexingActive:!1};return{...this.metrics,health:a,requestsPerSecond:t,errorRate:n,timeouts:this.timeoutCount,retries:this.retryCount,fastConnections:r,slowConnections:i,http2Info:o}}calculateHealth(e){let t,n,r=[],i=[];return e>.1?(t=`poor`,n=30,r.push(`High error rate: ${(e*100).toFixed(1)}%`),i.push(`Check network connectivity`)):e>.05?(t=`degraded`,n=60,r.push(`Moderate error rate: ${(e*100).toFixed(1)}%`),i.push(`Monitor connection stability`)):(t=`healthy`,n=100),this.metrics.averageConnectionTime>1e3&&(r.push(`Slow connections: ${this.metrics.averageConnectionTime.toFixed(0)}ms avg`),i.push(`Check network conditions`),n=Math.min(n,70)),{status:t,score:n,issues:r,recommendations:i}}reset(){this.metrics={activeConnections:0,totalConnections:0,reuseRate:0,averageConnectionTime:0},this.connectionTimes=[],this.requestCount=0,this.errorCount=0,this.timeoutCount=0,this.retryCount=0,this.startTime=Date.now()}async close(){this.reset()}async warmupConnections(e){let t=e.map(e=>this.request(e,{method:`HEAD`}).catch(()=>{}));await Promise.all(t)}};function V(){return{generate(){return s.randomUUID()}}}function H(){return{setTimeout:(e,t)=>globalThis.setTimeout(e,t),clearTimeout:e=>{globalThis.clearTimeout(e)},isBrowser:()=>!1,isOnline:()=>!0,isFileLike:e=>typeof e==`object`&&!!e&&(`uri`in e||`name`in e),getFileName:e=>{if(typeof e==`object`&&e&&`name`in e)return e.name;if(typeof e==`object`&&e&&`uri`in e){let t=e.uri;if(t)return t.split(`/`).pop()}},getFileType:e=>{if(typeof e==`object`&&e&&`type`in e)return e.type},getFileSize:e=>{if(typeof e==`object`&&e&&`size`in e)return e.size},getFileLastModified:e=>{if(typeof e==`object`&&e&&`lastModified`in e)return e.lastModified}}}function U(){let e=async e=>{let t={},n=await l.getAllKeys();for(let r in n)if(r.startsWith(e)){let e=await l.getItem(r);e&&(t[r]=e)}return t};return{async getItem(e){try{return await l.getItem(e)}catch(t){return console.error(`AsyncStorage getItem error for key ${e}:`,t),null}},async setItem(e,t){try{await l.setItem(e,t)}catch(t){throw console.error(`AsyncStorage setItem error for key ${e}:`,t),t}},async removeItem(e){try{await l.removeItem(e)}catch(t){throw console.error(`AsyncStorage removeItem error for key ${e}:`,t),t}},async findAll(){return e(``)},async find(t){return e(t)}}}var W=class{CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;readyState;onopen=null;onclose=null;onerror=null;onmessage=null;native;constructor(e){this.native=new WebSocket(e),this.readyState=this.native.readyState,this.native.onopen=()=>{this.readyState=this.native.readyState,this.onopen?.()},this.native.onclose=e=>{this.readyState=this.native.readyState,this.onclose?.({code:e.code??1e3,reason:e.reason??`undefined reason`})},this.native.onerror=e=>{this.onerror?.(e)},this.native.onmessage=e=>{this.onmessage?.({data:e.data})}}send(e){this.native.send(e)}close(e,t){this.native.close(e,t)}};const G=()=>({create:e=>new W(e)});function K(e={}){let{connectionPooling:t,useAsyncStorage:r=!0}=e;return{storage:r?U():n(),idGeneration:V(),httpClient:z(t),fileReader:A(),base64:T(),websocket:G(),abortController:w(),platform:H(),checksumService:k(),fingerprintService:F()}}function q(e){let n=K({connectionPooling:e.connectionPooling,useAsyncStorage:e.useAsyncStorage});return i({...e,webSocketFactory:n.websocket,abortControllerFactory:n.abortController,httpClient:n.httpClient,fileReader:n.fileReader,generateId:n.idGeneration,logger:r(!1,()=>{}),clientStorage:t(n.storage),checksumService:n.checksumService,fingerprintService:n.fingerprintService,platformService:n.platform})}function J(e){let t=g(e);return t.current=e,{client:h(()=>q({baseUrl:e.baseUrl,storageId:e.storageId,uploadistaBasePath:e.uploadistaBasePath,chunkSize:e.chunkSize,storeFingerprintForResuming:e.storeFingerprintForResuming,retryDelays:e.retryDelays,parallelUploads:e.parallelUploads,parallelChunkSize:e.parallelChunkSize,uploadStrategy:e.uploadStrategy,smartChunking:e.smartChunking,networkMonitoring:e.networkMonitoring,uploadMetrics:e.uploadMetrics,connectionPooling:e.connectionPooling,useAsyncStorage:e.useAsyncStorage,auth:e.auth,onEvent:e.onEvent}),[e.baseUrl,e.storageId,e.uploadistaBasePath,e.chunkSize,e.storeFingerprintForResuming,e.retryDelays,e.parallelUploads,e.parallelChunkSize,e.uploadStrategy,e.smartChunking,e.networkMonitoring,e.uploadMetrics,e.connectionPooling,e.useAsyncStorage,e.auth,e.onEvent]),config:e}}var Y=class{async pickDocument(e){try{let t=await _.getDocumentAsync({type:e?.allowedTypes||[`*/*`],copyToCacheDirectory:!0});if(t.canceled)return{status:`cancelled`};let n=t.assets?.[0];return n?{status:`success`,data:{uri:n.uri,name:n.name,size:n.size||0,mimeType:n.mimeType}}:{status:`cancelled`}}catch(e){return{status:`error`,error:e instanceof Error?e:Error(`Failed to pick document: ${e instanceof Error?e.message:String(e)}`)}}}async pickImage(e){try{let{status:t}=await v.requestMediaLibraryPermissionsAsync();if(t!==`granted`)return{status:`error`,error:Error(`Camera roll permission not granted`)};let n=await v.launchImageLibraryAsync({mediaTypes:`images`,selectionLimit:e?.allowMultiple?0:1,quality:1});if(n.canceled)return{status:`cancelled`};let r=n.assets?.[0];return r?{status:`success`,data:{uri:r.uri,name:r.fileName||`image-${Date.now()}.jpg`,size:r.fileSize||0,mimeType:`image/jpeg`}}:{status:`cancelled`}}catch(e){return{status:`error`,error:e instanceof Error?e:Error(`Failed to pick image: ${e instanceof Error?e.message:String(e)}`)}}}async pickVideo(e){try{let{status:t}=await v.requestMediaLibraryPermissionsAsync();if(t!==`granted`)return{status:`error`,error:Error(`Camera roll permission not granted`)};let n=await v.launchImageLibraryAsync({mediaTypes:`videos`,selectionLimit:e?.allowMultiple?0:1});if(n.canceled)return{status:`cancelled`};let r=n.assets?.[0];return r?{status:`success`,data:{uri:r.uri,name:r.fileName||`video-${Date.now()}.mp4`,size:r.fileSize||0,mimeType:`video/mp4`}}:{status:`cancelled`}}catch(e){return{status:`error`,error:e instanceof Error?e:Error(`Failed to pick video: ${e instanceof Error?e.message:String(e)}`)}}}async pickCamera(e){try{let{status:t}=await v.requestCameraPermissionsAsync();if(t!==`granted`)return{status:`error`,error:Error(`Camera permission not granted`)};let n=await v.launchCameraAsync({allowsEditing:!1,aspect:[4,3],quality:e?.quality??1});if(n.canceled)return{status:`cancelled`};let r=n.assets?.[0];return r?{status:`success`,data:{uri:r.uri,name:r.fileName||`photo-${Date.now()}.jpg`,size:r.fileSize||0,mimeType:`image/jpeg`}}:{status:`cancelled`}}catch(e){return{status:`error`,error:e instanceof Error?e:Error(`Failed to capture photo: ${e instanceof Error?e.message:String(e)}`)}}}async readFile(e){try{let t=new c.File(e);if(!t.exists)throw Error(`File does not exist`);return(await t.bytes()).buffer}catch(e){throw Error(`Failed to read file: ${e instanceof Error?e.message:String(e)}`)}}async getDocumentUri(e){return e}async getFileInfo(e){try{let t=new c.File(e);if(!t.exists)throw Error(`File does not exist`);return{uri:e,name:e.split(`/`).pop()||`unknown`,size:t.size??0,modificationTime:t.modificationTime?t.modificationTime*1e3:void 0}}catch(e){throw Error(`Failed to get file info: ${e instanceof Error?e.message:String(e)}`)}}};function X({children:e,...t}){let n=g(new Set),r=h(()=>new Y,[]),i=f(e=>{console.log(`[UploadistaProvider] Received event:`,e),console.log(`[UploadistaProvider] Broadcasting to`,n.current.size,`subscribers`),n.current.forEach(t=>{try{t(e)}catch(e){console.error(`Error in event subscriber:`,e)}})},[]),a=J({...t,onEvent:i}),o=f(e=>(n.current.add(e),()=>{n.current.delete(e)}),[]),s=h(()=>({...a,fileSystemProvider:r,subscribeToEvents:o,config:a.config}),[a,r,o]);return y(d.Provider,{value:s,children:y(u,{children:e})})}function Z(){let e=p(d);if(e===void 0)throw Error(`useUploadistaContext must be used within an UploadistaProvider. Make sure to wrap your component tree with <UploadistaProvider>.`);return e}function Q(e){if(!(`eventType`in e))return!1;let t=e;return t.eventType===b.JobStart||t.eventType===b.JobEnd||t.eventType===b.FlowStart||t.eventType===b.FlowEnd||t.eventType===b.FlowError||t.eventType===b.FlowPause||t.eventType===b.FlowCancel||t.eventType===b.NodeStart||t.eventType===b.NodeEnd||t.eventType===b.NodePause||t.eventType===b.NodeResume||t.eventType===b.NodeError||t.eventType===b.NodeStream||t.eventType===b.NodeResponse}function $(e){if(!(`type`in e))return!1;let t=e;return t.type===x.UPLOAD_STARTED||t.type===x.UPLOAD_PROGRESS||t.type===x.UPLOAD_COMPLETE||t.type===x.UPLOAD_FAILED||t.type===x.UPLOAD_VALIDATION_SUCCESS||t.type===x.UPLOAD_VALIDATION_FAILED||t.type===x.UPLOAD_VALIDATION_WARNING}function te(e){let{subscribeToEvents:t}=Z();m(()=>t(e),[t,e])}function ne(e){let{subscribeToEvents:t}=Z();m(()=>t(t=>{if(Q(t))switch(t.eventType){case b.JobStart:e.onJobStart?.(t);break;case b.JobEnd:e.onJobEnd?.(t);break;case b.FlowStart:e.onFlowStart?.(t);break;case b.FlowEnd:e.onFlowEnd?.(t);break;case b.FlowError:e.onFlowError?.(t);break;case b.FlowPause:e.onFlowPause?.(t);break;case b.FlowCancel:e.onFlowCancel?.(t);break;case b.NodeStart:e.onNodeStart?.(t);break;case b.NodeEnd:e.onNodeEnd?.(t);break;case b.NodePause:e.onNodePause?.(t);break;case b.NodeResume:e.onNodeResume?.(t);break;case b.NodeError:e.onNodeError?.(t);break}}),[t,e])}function re(e){let{subscribeToEvents:t}=Z();m(()=>t(t=>{if($(t))switch(t.type){case x.UPLOAD_STARTED:e.onUploadStarted?.(t.data);break;case x.UPLOAD_PROGRESS:e.onUploadProgress?.(t.data);break;case x.UPLOAD_COMPLETE:e.onUploadComplete?.(t.data);break;case x.UPLOAD_FAILED:e.onUploadFailed?.(t.data);break;case x.UPLOAD_VALIDATION_SUCCESS:e.onUploadValidationSuccess?.(t.data);break;case x.UPLOAD_VALIDATION_FAILED:e.onUploadValidationFailed?.(t.data);break;case x.UPLOAD_VALIDATION_WARNING:e.onUploadValidationWarning?.(t.data);break}}),[t,e])}export{Y as ExpoFileSystemProvider,X as UploadistaProvider,U as createAsyncStorageService,T as createExpoBase64Service,A as createExpoFileReaderService,z as createExpoHttpClient,V as createExpoIdGenerationService,K as createExpoServices,q as createUploadistaClient,Q as isFlowEvent,$ as isUploadEvent,ne as useFlowEvents,re as useUploadEvents,J as useUploadistaClient,Z as useUploadistaContext,te as useUploadistaEvents};
2
2
  //# sourceMappingURL=index.mjs.map