Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions manifest.webapp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,30 @@
"contacts": {
"description": "Required to search in contacts",
"type": "io.cozy.contacts"
},
"jobs": {
"description": "Required to search in jobs",
"type": "io.cozy.jobs"
},
"triggers": {
"description": "Required to search in triggers",
"type": "io.cozy.triggers"
},
"accounts": {
"description": "Required to search in accounts",
"type": "io.cozy.accounts"
},
"settings": {
"description": "Required to search in settings",
"type": "io.cozy.settings"
},
"konnectors": {
"description": "Required to search in konnectors",
"type": "io.cozy.konnectors"
},
"home": {
"description": "Required to search in home settings",
"type": "io.cozy.home.settings"
}
}
}
7 changes: 5 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
"dependencies": {
"comlink": "^4.4.1",
"cozy-app-publish": "^0.34.0",
"cozy-client": "^54.0.0",
"cozy-dataproxy-lib": "4.1.0",
"cozy-client": "^58.2.0",
"cozy-dataproxy-lib": "4.3.0",
"cozy-device-helper": "^3.7.1",
"cozy-flags": "^4.0.0",
"cozy-intent": "^2.29.2",
Expand All @@ -26,7 +26,10 @@
"cozy-tsconfig": "^1.2.0",
"flexsearch": "^0.7.43",
"lodash": "^4.17.21",
"pouchdb": "^9.0.0",
"pouchdb-adapter-indexeddb": "^9.0.0",
"pouchdb-browser": "^9.0.0",
"pouchdb-find": "^9.0.0",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
Expand Down
9 changes: 9 additions & 0 deletions src/@types/cozy-client.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ declare module 'cozy-client' {
token?: Token
uri?: string
warningForCustomHandlers?: boolean
disableStoreForQueries?: boolean
}

interface OAuthOptions {
Expand Down Expand Up @@ -185,6 +186,14 @@ declare module 'cozy-client' {
registerPlugin: (Plugin: Function, options: unknown) => void
getCollectionFromState: (doctype: string) => unknown
setLinks: (links: unknown[]) => void
requestMutation: (
definition: Mutation,
options?: MutationOptions
) => Promise<ClientResponse>
requestQuery: (
definition: QueryDefinition,
options?: QueryOptions
) => Promise<ClientResponse>
}

export const createMockClient = (options?: ClientOptions): CozyClient =>
Expand Down
4 changes: 4 additions & 0 deletions src/consts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,9 @@ export const REPLICATION_DEBOUNCE_MAX_DELAY = 600 * 1000 // 10min
export const FILES_DOCTYPE = 'io.cozy.files'
export const CONTACTS_DOCTYPE = 'io.cozy.contacts'
export const APPS_DOCTYPE = 'io.cozy.apps'
export const ACCOUNTS_DOCTYPE = 'io.cozy.accounts'
export const KONNECTORS_DOCTYPE = 'io.cozy.konnectors'
export const TRIGGERS_DOCTYPE = 'io.cozy.triggers'
export const SETTINGS_DOCTYPE = 'io.cozy.settings'

export const LOCALSTORAGE_KEY_DELETING_DATA = 'deletingLocalData'
13 changes: 11 additions & 2 deletions src/dataproxy/common/DataProxyInterface.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import type { InstanceOptions } from 'cozy-client'
import type { ClientCapabilities } from 'cozy-client/types/types'
import type { InstanceOptions, QueryDefinition } from 'cozy-client'
import type {
ClientCapabilities,
Mutation,
MutationOptions,
QueryOptions
} from 'cozy-client/types/types'

// TODO: Should be imported from cozy-dataproxy-lib
export interface SearchOptions {
Expand All @@ -10,6 +15,10 @@ export interface DataProxyWorker {
search: (query: string, options: SearchOptions) => unknown
setup: (clientData: ClientData) => Promise<void>
forceSyncPouch: () => void
requestLink: (
definition: QueryDefinition | Mutation,
options?: QueryOptions | MutationOptions
) => Promise<unknown>
}

export interface DataProxyWorkerPartialState {
Expand Down
13 changes: 13 additions & 0 deletions src/dataproxy/parent/ParentWindowProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import * as Comlink from 'comlink'
import React, { ReactNode } from 'react'

import { QueryDefinition } from 'cozy-client'
import {
Mutation,
MutationOptions,
QueryOptions
} from 'cozy-client/types/types'

import {
DataProxyWorkerContext,
SearchOptions
Expand Down Expand Up @@ -32,6 +39,12 @@ export const ParentWindowProvider = React.memo(
const result = await workerContext.worker.search(search, options)

return result
},
requestLink: async (
operation: QueryDefinition | Mutation,
options?: QueryOptions | MutationOptions | undefined
): Promise<unknown> => {
return workerContext.worker.requestLink(operation, options)
}
}

Expand Down
5 changes: 5 additions & 0 deletions src/dataproxy/worker/platformWorker.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
import PouchIndexedDBAdapter from 'pouchdb-adapter-indexeddb'
import PouchDB from 'pouchdb-browser'
import PouchDBFind from 'pouchdb-find'

const dbName = 'sharedWorkerStorage'
let db: IDBDatabase | null = null

PouchDB.plugin(PouchDBFind)
PouchDB.plugin(PouchIndexedDBAdapter)

const openDB = (): Promise<IDBDatabase> => {
return new Promise((resolve, reject) => {
if (db) {
Expand Down
70 changes: 63 additions & 7 deletions src/dataproxy/worker/shared-worker.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import * as Comlink from 'comlink'

import CozyClient, { StackLink } from 'cozy-client'
import CozyClient, { QueryDefinition, StackLink } from 'cozy-client'
import {
Mutation,
MutationOptions,
QueryOptions
} from 'cozy-client/types/types'
import { SearchEngine } from 'cozy-dataproxy-lib'
import Minilog from 'cozy-minilog'
import PouchLink from 'cozy-pouch-link'
Expand All @@ -9,6 +14,10 @@ import {
FILES_DOCTYPE,
CONTACTS_DOCTYPE,
APPS_DOCTYPE,
ACCOUNTS_DOCTYPE,
KONNECTORS_DOCTYPE,
TRIGGERS_DOCTYPE,
SETTINGS_DOCTYPE,
REPLICATION_DEBOUNCE,
REPLICATION_DEBOUNCE_MAX_DELAY
} from '@/consts'
Expand Down Expand Up @@ -41,12 +50,26 @@ const dataProxy: DataProxyWorker = {
updateState()

const pouchLinkOptions = {
doctypes: [FILES_DOCTYPE, CONTACTS_DOCTYPE, APPS_DOCTYPE],
doctypes: [
FILES_DOCTYPE,
CONTACTS_DOCTYPE,
APPS_DOCTYPE,
ACCOUNTS_DOCTYPE,
TRIGGERS_DOCTYPE,
KONNECTORS_DOCTYPE,
SETTINGS_DOCTYPE
],
readOnly: true,
initialSync: true,
periodicSync: false,
syncDebounceDelayInMs: REPLICATION_DEBOUNCE,
syncDebounceMaxDelayInMs: REPLICATION_DEBOUNCE_MAX_DELAY,
platform: { ...platformWorker },
pouch: {
options: {
adapter: 'indexeddb'
}
},
doctypesReplicationOptions: {
[FILES_DOCTYPE]: {
strategy: 'fromRemote'
Expand All @@ -56,6 +79,18 @@ const dataProxy: DataProxyWorker = {
},
[APPS_DOCTYPE]: {
strategy: 'fromRemote'
},
[ACCOUNTS_DOCTYPE]: {
strategy: 'fromRemote'
},
[KONNECTORS_DOCTYPE]: {
strategy: 'fromRemote'
},
[TRIGGERS_DOCTYPE]: {
strategy: 'fromRemote'
},
[SETTINGS_DOCTYPE]: {
strategy: 'fromRemote'
}
}
}
Expand All @@ -68,17 +103,18 @@ const dataProxy: DataProxyWorker = {
version: '1'
},
schema,
store: true
disableStoreForQueries: true
})

// If the device is not trusted, we do not want to store any private data in Pouch
// So use the PouchLink only if the user declared a trustful device for the given session
const isTrustedDevice = await queryIsTrustedDevice(client)
const link = isTrustedDevice
? new PouchLink(pouchLinkOptions)
: new StackLink()
// TODO: we should add the possibility to disable the pouchlink with a flag
const links = isTrustedDevice
? [new PouchLink(pouchLinkOptions), new StackLink()]
: [new StackLink()]

await client.setLinks([link])
await client.setLinks(links)
client.instanceOptions = clientData.instanceOptions
client.capabilities = clientData.capabilities

Expand All @@ -104,6 +140,26 @@ const dataProxy: DataProxyWorker = {
return results
},

requestLink: async (
operation: QueryDefinition | Mutation,
options?: QueryOptions | MutationOptions | undefined
): Promise<unknown> => {
if (!client) {
throw new Error(
'Client is required to request, please initialize CozyClient'
)
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (operation.mutationType) {
return client.requestMutation(operation, options)
}
const queryRes = (await client.requestQuery(
operation as QueryDefinition,
options as QueryOptions
)) as unknown
return queryRes
},

forceSyncPouch: () => {
if (!client) {
throw new Error(
Expand Down
2 changes: 1 addition & 1 deletion src/targets/browser/setupApp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ const makeClient = (container: HTMLElement): CozyClient => {
version: manifest.version
},
schema,
store: true
disableStoreForQueries: true
})

return client
Expand Down
Loading