diff --git a/Sources/PrivMXEndpointSwiftExtra/Core/PrivMXEndpoint.swift b/Sources/PrivMXEndpointSwiftExtra/Core/PrivMXEndpoint.swift index 3189d5e..9e519b0 100644 --- a/Sources/PrivMXEndpointSwiftExtra/Core/PrivMXEndpoint.swift +++ b/Sources/PrivMXEndpointSwiftExtra/Core/PrivMXEndpoint.swift @@ -983,7 +983,6 @@ public class PrivMXEndpoint: Identifiable, @unchecked Sendable{ /// - Parameter request: the request specifying Event Type and Scope /// /// - Throws: When unsubscribing fails. - @available(*, deprecated, message: "Removing part of the callbacks causes Undefined Behaviour in 2.6.0, please use clearAllCallbacks() instead") public func clearCallbacks( for request: PMXEventSubscriptionRequest ) throws -> Void { @@ -1015,7 +1014,6 @@ public class PrivMXEndpoint: Identifiable, @unchecked Sendable{ /// - Parameter group: the group that has been assigned when registering callbacks. /// /// - Throws: when unsubscribing fails. - @available(*, deprecated, message: "Removing part of the callbacks causes Undefined Behaviour in 2.6.0, please use clearAllCallbacks() instead") public func clearCallbacks( in group:String ) throws -> Void { diff --git a/Sources/PrivMXEndpointSwiftExtra/Stores/PrivMXStoreFileHandlerExtensions.swift b/Sources/PrivMXEndpointSwiftExtra/Stores/PrivMXStoreFileHandlerExtensions.swift index 9253d86..af650d1 100644 --- a/Sources/PrivMXEndpointSwiftExtra/Stores/PrivMXStoreFileHandlerExtensions.swift +++ b/Sources/PrivMXEndpointSwiftExtra/Stores/PrivMXStoreFileHandlerExtensions.swift @@ -116,7 +116,7 @@ extension PrivMXStoreFileHandler{ chunkSize: chunkSize) } - /// Creates a handler for updating a file with a new data buffer. + /// Creates a handler for creating a file with a new data buffer. /// /// - Parameters: /// - storeId: The ID of the Store in which the file is to be created. @@ -126,7 +126,7 @@ extension PrivMXStoreFileHandler{ /// - privateMeta: The new private metadata for the file. /// - fileSize: The size of the file to be updated. /// - chunkSize: The size of the chunks for the upload. Defaults to the recommended chunk size. - /// - Returns: A new `PrivMXStoreFileHandler` instance configured for updating the file. + /// - Returns: A new `PrivMXStoreFileHandler` instance configured for creating the file. /// - Throws: An error if the file cannot be opened or updated. public static func getStoreFileCreator( inStore storeId:String, diff --git a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Connections.swift b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Connections.swift index c3bd8bb..dfe6d48 100644 --- a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Connections.swift +++ b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Connections.swift @@ -122,7 +122,13 @@ class PrivMXSnippetClass { } func gettingContextUsers() throws{ - let contextUserInfo = try endpointSession?.connection.getContextUsers(of: CONTEXT_ID) + let contextUserInfo = try endpointSession?.connection.listContextUsers( + of: CONTEXT_ID, + basedOn: privmx.endpoint.core.PagingQuery( + skip: 0, + limit: 100, + sortOrder: .asc) + ) } func teardown() { diff --git a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/CustomEvents.swift b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/CustomEvents.swift index c0c6efe..25d3dc8 100644 --- a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/CustomEvents.swift +++ b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/CustomEvents.swift @@ -17,7 +17,6 @@ import PrivMXEndpointSwiftNative extension PrivMXSnippetClass { var CHANNEL_NAME: String {"CUSTOM_CHANNEL"} - var channel: EventChannel { EventChannel.custom(contextId: CONTEXT_ID , name: CHANNEL_NAME)} func emittingCustomEvents() throws { @@ -26,17 +25,21 @@ extension PrivMXSnippetClass { to: [privmx.endpoint.core.UserWithPubKey(userId: USER1_ID, pubKey: USER1_PUBLIC_KEY), privmx.endpoint.core.UserWithPubKey(userId: USER2_ID, pubKey: USER2_PUBLIC_KEY), ], - on: channel.name, + on: CHANNEL_NAME, containing: Data()) } func handlingCustomEvents() throws{ + try endpointSession?.registerCallback( - for: privmx.endpoint.event.ContextCustomEvent.self, - from: channel, - identified: "SOME_UNIQUE_IDENTIFIER", - { data in - // some actions when a custom event is received - }) + for: PMXEventCallbackRegistration( + request: .custom( + channelName: CHANNEL_NAME, + contextId: CONTEXT_ID), + group: "some_group", + cb: {data in + + }) + ) } } diff --git a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/Events.swift b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/Events.swift index 91c7748..810b0b6 100644 --- a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/Events.swift +++ b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/Events.swift @@ -24,36 +24,57 @@ extension PrivMXSnippetClass { } func addEventListener(){ - var storeId = "STORE_ID" - _ = try? endpointSession?.registerCallback( - for: privmx.endpoint.store.StoreFileUpdatedEvent.self, - from: EventChannel.storeFiles(storeID: storeId), identified: "some_id" - ) { - eventData in - } + let storeId = "STORE_ID" + try? endpointSession?.registerCallback( + for: .init( + request: .store(eventType: privmx.endpoint.store.STORE_CREATE, + selectorType: PMXEventSelectorType.Context, + selectorId: CONTEXT_ID), + group: "some_group", + cb: { + eventData in + // some actions to take + }) + ) } - func removeEventListener(){ - var storeId = "STORE_ID" - guard let callbackId = try? endpointSession?.registerCallback( - for: privmx.endpoint.store.StoreFileUpdatedEvent.self, - from: EventChannel.storeFiles(storeID: storeId), identified: "some_id", - { eventData in - } - ) else {return} - - endpointContainer?.getEndpoint(endpointId)?.deleteCallbacks(identified: "some_id") - - } + func removeEventListenerByGroup(){ + let storeId = "STORE_ID" + do{ + try endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .store(eventType: privmx.endpoint.store.FILE_CREATE, + selectorType: PMXEventSelectorType.Container, + selectorId: storeId), + group: "some_group", + cb: { + eventData in + // some actions to take + }) + ) + + try endpointContainer? + .getEndpoint(endpointId)? + .clearCallbacks(in: "some_group") + } catch { + print(error) + } + + } - func unregisterCallbacks(){ - endpointContainer?.getEndpoint(endpointId)?.clearCallbacks(for: .platform ) - - - } + func unregisterCallbacksByRequest(){ + let threadId = "THREAD_ID" + + + try? endpointContainer?.getEndpoint(endpointId)?.clearCallbacks( + for: .thread( + eventType: privmx.endpoint.thread.MESSAGE_UPDATE, + selectorType: PMXEventSelectorType.Container, + selectorId: threadId)) + } func unregisterAllCallbacks(){ - endpointContainer?.getEndpoint(endpointId)?.clearAllCallbacks() + try? endpointContainer?.getEndpoint(endpointId)?.clearAllCallbacks() } diff --git a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/EventsHandling.swift b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/EventsHandling.swift index 5cdf1d3..403fa53 100644 --- a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/EventsHandling.swift +++ b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Events/EventsHandling.swift @@ -16,235 +16,745 @@ import PrivMXEndpointSwiftNative extension PrivMXSnippetClass { - func handlingConnectionEvents(){ - try? endpointSession?.registerCallback( - for: privmx.endpoint.core.LibConnectedEvent.self, - from: .platform, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when lib connect - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.core.LibDisconnectedEvent.self, - from: .platform, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when lib disconnects - }) - } + func handlingConnectionEvents(){ + let request : PMXEventSubscriptionRequest = PMXEventSubscriptionRequest.library( + eventType:LibEventType.LIB_CONNECTED) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: request, + group: "SOME_GROUP", + cb: {_ in + // Some actions to perform after connecting + })) + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .library( + eventType: .LIB_DISCONNECTED), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when lib disconnects + })) + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .library( + eventType: .LIB_PLATFORM_DISCONNECTED), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when disconect method was called + })) + } - func handlingThreadEvents(){ + func handlingThreadEvents(){ + let threadId = "THREAD_ID" + try? endpointSession?.registerCallback( - for: privmx.endpoint.thread.ThreadCreatedEvent.self, - from: .thread, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when new thread created - }) + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.THREAD_CREATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a new thread created + })) try? endpointSession?.registerCallback( - for: privmx.endpoint.thread.ThreadUpdatedEvent.self, - from: .thread, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when thread updated - }) + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.THREAD_UPDATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a thread is updated + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.THREAD_UPDATE, + selectorType: .Container, + selectorId: threadId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a thread is updated + })) try? endpointSession?.registerCallback( - for: privmx.endpoint.thread.ThreadStatsChangedEvent.self, - from: .thread, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when thread stats changes - }) + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.THREAD_STATS, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a thread's stats change + })) + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.THREAD_STATS, + selectorType: .Container, + selectorId: threadId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a thread's stats change + })) try? endpointSession?.registerCallback( - for: privmx.endpoint.thread.ThreadDeletedEvent.self, - from: .thread, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when thread deleted - }) + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.THREAD_DELETE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a thread is deleted + })) + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.THREAD_DELETE, + selectorType: .Container, + selectorId: threadId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a thread is deleted + })) + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.COLLECTION_CHANGE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any thread's contents change + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.COLLECTION_CHANGE, + selectorType: .Container, + selectorId: threadId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular thread's contents change + })) } - func handlingMessagesEvents(){ - var threadId = "THREAD_ID" - - try? endpointSession?.registerCallback( - for: privmx.endpoint.thread.ThreadNewMessageEvent.self, - from: .threadMessages(threadID: threadId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions on new message - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.thread.ThreadMessageDeletedEvent.self, - from: .threadMessages(threadID: threadId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when message deleted - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.thread.ThreadMessageDeletedEvent.self, - from: .threadMessages(threadID: threadId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when message updated - }) - - - - } + func handlingMessagesEvents(){ + let threadId = "THREAD_ID" + let messageId = "MESSAGE_ID" + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.MESSAGE_CREATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions on new message + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.MESSAGE_CREATE, + selectorType: .Container, + selectorId: threadId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions on new message in a particular thread + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.MESSAGE_UPDATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a message is updated + })) + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.MESSAGE_UPDATE, + selectorType: .Container, + selectorId: threadId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a message is updated in a particular thread + })) + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.MESSAGE_UPDATE, + selectorType: .Item, + selectorId: messageId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a message is updated + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.MESSAGE_DELETE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a message is deleted + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.MESSAGE_DELETE, + selectorType: .Container, + selectorId: threadId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a message is deleted in a particular thread + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .thread( + eventType: privmx.endpoint.thread.MESSAGE_DELETE, + selectorType: .Item, + selectorId: messageId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular message is deleted + })) + } func handlingStoresEvents(){ + let storeId = "STORE_ID" + try? endpointSession?.registerCallback( - for: privmx.endpoint.store.StoreCreatedEvent.self, - from: .store, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when new store created - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.store.StoreUpdatedEvent.self, - from: .store, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when store updated - }) + for:PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.STORE_CREATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a new store is created + })) try? endpointSession?.registerCallback( - for: privmx.endpoint.store.StoreStatsChangedEvent.self, - from: .store, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when store stats changes - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.store.StoreDeletedEvent.self, - from: .store, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when store deleted - }) + for:PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.STORE_UPDATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any store is updated + })) + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.STORE_UPDATE, + selectorType: .Container, + selectorId: storeId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular store is updated + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.STORE_DELETE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any store is deleted + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.STORE_DELETE, + selectorType: .Container, + selectorId: storeId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular store is deleted + })) + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.STORE_STATS, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any store's stats change + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.STORE_STATS, + selectorType: .Container, + selectorId: storeId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular store's stats change + })) + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.COLLECTION_CHANGE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any store's contents change + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.COLLECTION_CHANGE, + selectorType: .Container, + selectorId: storeId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular store's contents change + })) } func handlingFilesEvents(){ - var storeId = "STORE_ID" - - try? endpointSession?.registerCallback( - for: privmx.endpoint.store.StoreFileCreatedEvent.self, - from: .storeFiles(storeID: storeId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions on new file - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.store.StoreFileUpdatedEvent.self, - from: .storeFiles(storeID: storeId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when file updated - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.store.StoreFileDeletedEvent.self, - from: .storeFiles(storeID: storeId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when message updated - }) - - + let storeId = "STORE_ID" + let fileId = "FILE_ID" + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.FILE_CREATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a file is cerated + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.FILE_CREATE, + selectorType: .Container, + selectorId: storeId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions on new file in a particular store + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.FILE_UPDATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a file is updated + })) + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.FILE_UPDATE, + selectorType: .Container, + selectorId: storeId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a file is updated in a particular store + })) + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.FILE_UPDATE, + selectorType: .Item, + selectorId: fileId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a file is updated + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.FILE_DELETE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a file is deleted + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.FILE_DELETE, + selectorType: .Container, + selectorId: storeId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a file is deleted in a particular store + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .store( + eventType: privmx.endpoint.store.FILE_DELETE, + selectorType: .Item, + selectorId: fileId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular message is deleted + })) + } func handlingInboxesEvents(){ + let inboxId = "INBOX_ID" + try? endpointSession?.registerCallback( - for: privmx.endpoint.inbox.InboxCreatedEvent.self, - from: .inbox, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when new inbox created - }) + for: PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.INBOX_CREATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a new inbox is created + })) try? endpointSession?.registerCallback( - for: privmx.endpoint.inbox.InboxUpdatedEvent.self, - from: .inbox, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when inbox updated - }) + for: PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.INBOX_UPDATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any inbox is updated + })) try? endpointSession?.registerCallback( - for: privmx.endpoint.inbox.InboxDeletedEvent.self, - from: .inbox, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when inbox deleted - }) + for: PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.INBOX_UPDATE, + selectorType: .Container, + selectorId: inboxId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular inbox is updated + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.INBOX_DELETE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any inbox is deleted + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.INBOX_DELETE, + selectorType: .Container, + selectorId: inboxId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular inbox is deleted + })) + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.COLLECTION_CHANGE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any inbox's contents chenge + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.COLLECTION_CHANGE, + selectorType: .Container, + selectorId: inboxId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular inbox's contents change + })) } func handlingEntriesEvents(){ - var inboxId = "INBOX_ID" - - try? endpointSession?.registerCallback( - for: privmx.endpoint.inbox.InboxEntryCreatedEvent.self, - from: .inboxEntries(inboxID: inboxId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions on new inbox entry - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.inbox.InboxEntryDeletedEvent.self, - from: .inboxEntries(inboxID: inboxId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when inbox entry deleted - }) + let inboxId = "INBOX_ID" + let entryId = "ENTRY_ID" + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.ENTRY_CREATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when an inbox entry is created + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.ENTRY_CREATE, + selectorType: .Container, + selectorId: inboxId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when an inbox entry is created in a particular inbox + })) + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.ENTRY_DELETE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when an inbox entry is deleted + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.ENTRY_DELETE, + selectorType: .Container, + selectorId: inboxId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when an inbox entry is deleted in a particular inbox + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .inbox( + eventType: privmx.endpoint.inbox.ENTRY_DELETE, + selectorType: .Item, + selectorId: entryId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular inbox entry is deleted + })) } func handlingKvdbsEvents(){ - - try? endpointSession?.registerCallback( - for: privmx.endpoint.kvdb.KvdbCreatedEvent.self, - from: .kvdb, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when new kvdb created - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.kvdb.KvdbUpdatedEvent.self, - from: .kvdb, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when kvdb updated - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.kvdb.KvdbStatsChangedEvent.self, - from: .kvdb, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when kvdb stats changed - }) + let kvdbId = "KVDB_ID" + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.KVDB_CREATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a new kvdb is created + })) - try? endpointSession?.registerCallback( - for: privmx.endpoint.kvdb.KvdbDeletedEvent.self, - from: .kvdb, identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when kvdb deleted - }) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.KVDB_UPDATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any kvdb is updated + })) - } + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.KVDB_UPDATE, + selectorType: .Container, + selectorId: kvdbId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular kvdb is updated + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.KVDB_DELETE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any kvdb is deleted + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.KVDB_DELETE, + selectorType: .Container, + selectorId: kvdbId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular kvdb is deleted + })) + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.KVDB_STATS, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any kvdb's stats change + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.KVDB_STATS, + selectorType: .Container, + selectorId: kvdbId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular kvdb's stats change + })) + + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.COLLECTION_CHANGE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when any kvdb's contents change + })) + try? endpointSession?.registerCallback( + for:PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.COLLECTION_CHANGE, + selectorType: .Container, + selectorId: kvdbId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular kvdb's contents change + })) + } func handlingkvdbEntriesEvents(){ - var kvdbId = "KVDB_ID" + let kvdbId = "KVDB_ID" + let entryKey = "ENTRY_KEY" - try? endpointSession?.registerCallback( - for: privmx.endpoint.kvdb.KvdbNewEntryEvent.self, - from: .kvdbEntries(kvdbId: kvdbId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when new kvdb entry created - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.kvdb.KvdbEntryUpdatedEvent.self, - from: .kvdbEntries(kvdbId: kvdbId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when kvdb entry updated - }) - - try? endpointSession?.registerCallback( - for: privmx.endpoint.kvdb.KvdbEntryDeletedEvent.self, - from: .kvdbEntries(kvdbId: kvdbId), identified: "SOME_UNIQUE_IDENTIFIER", - { eventData in - // some actions when kvdb entry deleted - }) - } + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.ENTRY_CREATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when new entry is created + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.ENTRY_CREATE, + selectorType: .Container, + selectorId: kvdbId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a new entry is created in a particular kvdb + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.ENTRY_UPDATE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when an entry is updated + })) + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.ENTRY_UPDATE, + selectorType: .Container, + selectorId: kvdbId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when an entry is updated in a particular kvdb + })) + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .kvdbEntry( + eventType: privmx.endpoint.kvdb.ENTRY_UPDATE, + kvdbId: kvdbId, + entryKey: entryKey), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when an entry is updated + })) + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.ENTRY_DELETE, + selectorType: .Context, + selectorId: CONTEXT_ID), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when an entry is deleted + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .kvdb( + eventType: privmx.endpoint.kvdb.ENTRY_DELETE, + selectorType: .Container, + selectorId: kvdbId), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when an entry is deleted in a particular kvdb + })) + + try? endpointSession?.registerCallback( + for: PMXEventCallbackRegistration( + request: .kvdbEntry( + eventType: privmx.endpoint.kvdb.ENTRY_DELETE, + kvdbId: kvdbId, + entryKey: entryKey), + group: "SOME_UNIQUE_IDENTIFIER", + cb:{ eventData in + // some actions when a particular entry is deleted + })) + } } diff --git a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Inboxes/InboxesEntries.swift b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Inboxes/InboxesEntries.swift index 41a0b6f..41c34ce 100644 --- a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Inboxes/InboxesEntries.swift +++ b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Inboxes/InboxesEntries.swift @@ -83,7 +83,6 @@ extension PrivMXSnippetClass { //3 try? publicEndpointSession?.inboxApi?.writeToFile(inboxFileHandle, of: entryHandle, uploading: data) - try? publicEndpointSession?.inboxApi?.closeFile(withHandle: inboxFileHandle) //4 try? publicEndpointSession?.inboxApi?.sendEntry(entryHandle) diff --git a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Kvdbs/KvdbsOverview.swift b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Kvdbs/KvdbsOverview.swift index 446938e..ce8b56b 100644 --- a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Kvdbs/KvdbsOverview.swift +++ b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Kvdbs/KvdbsOverview.swift @@ -94,7 +94,7 @@ extension PrivMXSnippetClass { let currentKvdb = try kvdbApi.getKvdb(KVDB_ID) try kvdbApi.updateKvdb( - kvdbId, + KVDB_ID, atVersion: currentKvdb.version, replacingUsers: [privmx.endpoint.core.UserWithPubKey( userId: USER1_ID, @@ -128,6 +128,6 @@ extension PrivMXSnippetClass { func gettingKvdb() throws{ let KVDB_ID = "ID of your KVDB" - let kvdb = kvdbApi.getKvdb(KVDB_ID) + let kvdb = try kvdbApi.getKvdb(KVDB_ID) } } diff --git a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Stores/StoresFiles.swift b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Stores/StoresFiles.swift index 57dc271..1aa86ea 100644 --- a/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Stores/StoresFiles.swift +++ b/examples/snippets/PrivMXSnippets/PrivMXSnippets/Stacks/Swift/Stores/StoresFiles.swift @@ -30,9 +30,15 @@ extension PrivMXSnippetClass { in: storeID, withPublicMeta: Data(), withPrivateMeta: Data(), - ofSize: Int64(fileContentData.count)) + ofSize: Int64(fileContentData.count), + randomWriteSupport: false) else {return} - try? endpointSession?.storeApi?.writeToFile(withHandle: storeFileHandle, uploading: fileContentData) + try? endpointSession?.storeApi?.writeToFile( + withHandle: storeFileHandle, + uploading: fileContentData, + truncate: false) + let storeFileId = try? endpointSession?.storeApi?.closeFile(withHandle: storeFileHandle) + } public func uploadWithFileMeta(){ @@ -46,9 +52,16 @@ extension PrivMXSnippetClass { in: storeID, withPublicMeta: Data(), withPrivateMeta: filePrivateMetaData, - ofSize: Int64(fileContentData.count)) + ofSize: Int64(fileContentData.count), + randomWriteSupport: false) else {return} - try? endpointSession?.storeApi?.writeToFile(withHandle: storeFileHandle, uploading: fileContentData) + + try? endpointSession?.storeApi?.writeToFile( + withHandle: storeFileHandle, + uploading: fileContentData, + truncate: false) + + let storeFileId = try? endpointSession?.storeApi?.closeFile(withHandle: storeFileHandle) } @@ -57,11 +70,14 @@ extension PrivMXSnippetClass { Task{ let storeID = "STORE_ID" let URL = URL(fileURLWithPath: "/path/to/file/Filename.txt") - guard let fileHandle = try? FileHandle(forReadingFrom: URL) else { return } + + guard let fileHandle = try? FileHandle(forReadingFrom: URL) else { return } let fileSize:Int64 = 0 //to be provided by app let filePrivateMeta = FilePrivateMeta(name: "Filename.txt", mimetype: "text/plain") - guard let filePrivateMetaData = try? JSONEncoder().encode(filePrivateMeta) else {return} - let newFileId = try? await endpointSession?.startUploadingNewFile(fileHandle, + + guard let filePrivateMetaData = try? JSONEncoder().encode(filePrivateMeta) else {return} + + let newFileId = try? await endpointSession?.startUploadingNewFile(fileHandle, to: storeID, withPublicMeta: Data(), withPrivateMeta: filePrivateMetaData, @@ -73,6 +89,48 @@ extension PrivMXSnippetClass { } + public func uploadingForRW(){ + let storeID = "STORE_ID" + guard let fileContentData = "Text file content".data(using: .utf8 ) else {return} + guard let storeFileHandle = try? endpointSession?.storeApi?.createFile( + in: storeID, + withPublicMeta: Data(), + withPrivateMeta: Data(), + ofSize: Int64(fileContentData.count), + randomWriteSupport: true) + else {return} + + try? endpointSession?.storeApi?.writeToFile( + withHandle: storeFileHandle, + uploading: fileContentData, + truncate: false) + + let storeFileId = try? endpointSession?.storeApi?.closeFile(withHandle: storeFileHandle) + + } + + public func readWriteFile(){ + let fileId = "FILE_ID_WITH_RR_SUPPORT" + guard let rwHandle = try? endpointSession?.storeApi?.openFile(fileId) else {return} + + let readData = try? endpointSession?.storeApi?.readFromFile(withHandle: rwHandle, length: 128) + + try? endpointSession?.storeApi?.seekInFile(withHandle: rwHandle, toPosition: 64) + try? endpointSession?.storeApi?.writeToFile( + withHandle: rwHandle, + uploading: Data("some new data".utf8), + truncate: true) + } + + public func syncHandle(){ + let rwHandle = privmx.StoreFileHandle() // normally retrieved by opening a file + + try? endpointSession?.storeApi?.syncFile(withHandle: rwHandle) + try? endpointSession?.storeApi?.seekInFile(withHandle: rwHandle, toPosition: 0) + + let newData = try? endpointSession?.storeApi?.readFromFile(withHandle: rwHandle, length: 79) + } + func gettingFilesMostRecent(){ let startIndex:Int64 = 0 let pageSize:Int64 = 100 @@ -82,9 +140,10 @@ extension PrivMXSnippetClass { from:storeId, basedOn: .init(skip: startIndex, limit: pageSize, sortOrder: .desc)) else {return} - let files = - pagingList.readItems.map { $0 } + let files = pagingList.readItems.map { $0 } } + + func getingFilesOldest(){ let startIndex:Int64 = 0 @@ -95,8 +154,7 @@ extension PrivMXSnippetClass { from:storeId, basedOn: .init(skip: startIndex, limit: pageSize, sortOrder: .asc)) else {return} - let files = - pagingList.readItems.map { $0 } + let files = pagingList.readItems.map { $0 } } func gettingFilesByID(){ @@ -107,24 +165,53 @@ extension PrivMXSnippetClass { func changingFilename(){ - - var fileID = "FILE_ID" + + let fileID = "FILE_ID" guard let file = try? endpointSession?.storeApi? .getFile(fileID) else {return} let newFilePrivateMeta = FilePrivateMeta(name: "New Filename.txt", mimetype: "text/plain") guard let newFilePrivateMetaData = try? JSONEncoder().encode(newFilePrivateMeta) else {return} guard let filePublicMetaData = file.publicMeta.getData() else {return} try? endpointSession?.storeApi? - .updateFile(fileID, - replacingPublicMeta: filePublicMetaData, - replacingPrivateMeta: newFilePrivateMetaData, - replacingSize: file.size) + .updateFileMeta( + of: fileID, + replacingPublicMeta: filePublicMetaData, + replacingPrivateMeta: newFilePrivateMetaData) } + func overwritingFile(){ + + let fileID = "FILE_ID" + let URL = URL(fileURLWithPath: "/path/to/file/Filename.txt") + + let newFilePrivateMeta = FilePrivateMeta(name: "New file title", mimetype: "text/plain") + + guard let fileHandle = try? FileHandle(forReadingFrom: URL), + let newFilePrivateMetaData = try? JSONEncoder().encode(newFilePrivateMeta), + let storeApi = endpointSession?.storeApi, + let newFileSize = try? URL.resourceValues(forKeys: [.fileSizeKey]).fileSize else {return} + + guard let updater = try? PrivMXStoreFileHandler.getStoreFileUpdater( + for: fileID, + withReplacement: fileHandle, + using: storeApi, + replacingPublicMeta: Data(), + replacingPrivateMeta: newFilePrivateMetaData, + replacingFileSize: Int64(newFileSize), + chunkSize: PrivMXStoreFileHandler.RecommendedChunkSize) else {return} + + while updater.hasDataLeft{ + try? updater.writeChunk() + } + + try? updater.close() + } + + + func deletingFile(){ - var fileID = "FILE_ID" + let fileID = "FILE_ID" try? endpointSession?.storeApi?.deleteFile(fileID) - } }