{"version":3,"sources":["../src/graph/createGraphFromStore.ts"],"sourcesContent":["import { SlantGraph, SlantNodeSchema } from '@msinternal/botframework-webchat-core-graph';\nimport { parse } from 'valibot';\nimport type createStore from '../createStore';\nimport { getLocalIdFromActivity } from '../reducers/activities/sort/property/LocalId';\nimport { getPositionFromActivity } from '../reducers/activities/sort/property/Position';\nimport type { Activity } from '../reducers/activities/sort/types';\n\nfunction createGraphFromStore(store: ReturnType<typeof createStore>): SlantGraph {\n  const graph = new SlantGraph();\n  let prevActivities: readonly Activity[] | undefined;\n\n  // TODO: [P0] Except channel audience, we should be specific about all audience, e.g. name.\n  const channelAudience = parse(SlantNodeSchema, {\n    '@context': 'https://schema.org',\n    '@id': '_:audience/channel',\n    '@type': ['Audience'],\n    audienceType: ['channel']\n  });\n\n  const othersAudience = parse(SlantNodeSchema, {\n    '@context': 'https://schema.org',\n    '@id': '_:audience/others',\n    '@type': ['Audience'],\n    audienceType: ['others']\n  });\n\n  const selfAudience = parse(SlantNodeSchema, {\n    '@context': 'https://schema.org',\n    '@id': '_:audience/user',\n    '@type': ['Audience'],\n    audienceType: ['self']\n  });\n\n  graph.act(graph => graph.upsert(othersAudience, channelAudience, selfAudience));\n\n  store.subscribe(() => {\n    const { activities }: { activities: readonly Activity[] } = store.getState();\n\n    if (Object.is(activities, prevActivities)) {\n      return;\n    }\n\n    const activitySet = new Set(activities);\n    const prevActivitySet = new Set(prevActivities);\n\n    // TODO: [P*] Supports deleting node from the graph.\n    const addedActivities = activitySet.difference(prevActivitySet);\n\n    graph.act(graph => {\n      for (const activity of addedActivities) {\n        const {\n          from: { role }\n        } = activity;\n\n        const localId = getLocalIdFromActivity(activity);\n        const position = getPositionFromActivity(activity);\n\n        // TODO: Should use Person and more specific than just \"Others\".\n        const sender =\n          role === 'bot'\n            ? { '@id': othersAudience['@id'] }\n            : role === 'user'\n              ? { '@id': selfAudience['@id'] }\n              : role === 'channel'\n                ? { '@id': channelAudience['@id'] }\n                : undefined;\n\n        if (activity.type === 'message' || activity.type === 'typing') {\n          // TODO: [P*] If this is livestreaming, add isPartOf to indicate the livestream head.\n          graph.upsert({\n            '@context': 'https://schema.org',\n\n            '@id': localId,\n            '@type': ['Message', `urn:microsoft:webchat:direct-line-activity`],\n\n            encodingFormat:\n              'textFormat' in activity && activity.textFormat !== 'markdown' ? 'text/plain' : 'text/markdown',\n\n            // TODO: [P0] activity.id could be null here.\n            // TODO: [P0] Not sure if we need client activity ID here as we already have permanent ID.\n            identifier: [\n              ...(activity.id ? [`urn:microsoft:webchat:direct-line-activity:id:${activity.id}`] : []),\n              ...(typeof activity.channelData.clientActivityID === 'string'\n                ? [`urn:microsoft:webchat:client-activity-id:${activity.channelData.clientActivityID}`]\n                : [])\n            ],\n\n            position,\n            sender,\n            text: ('text' in activity && typeof activity.text === 'string' && activity.text) || undefined,\n\n            'urn:microsoft:webchat:direct-line-activity:raw-json': { '@type': '@json', '@value': activity },\n            'urn:microsoft:webchat:direct-line-activity:type': activity.type\n          });\n        } else if (typeof activity.type === 'string') {\n          graph.upsert({\n            '@context': 'https://schema.org',\n            '@id': localId,\n            '@type': Object.freeze(['urn:microsoft:webchat:direct-line-activity']),\n            identifier: activity.id && `urn:microsoft:webchat:direct-line-activity:id:${activity.id}`,\n            position,\n            sender,\n            'urn:microsoft:webchat:direct-line-activity:raw-json': { '@type': '@json', '@value': activity },\n            'urn:microsoft:webchat:direct-line-activity:type': activity.type\n          });\n        } else {\n          console.warn(\n            `botframework-webchat: Activity must have \"type\" with value of string, ignoring activity without proper \"type\" field.`,\n            { activity }\n          );\n        }\n      }\n    });\n\n    prevActivities = activities;\n  });\n\n  return graph;\n}\n\nexport default createGraphFromStore;\n"],"mappings":"gHACA,OAAS,SAAAA,MAAa,UAMtB,SAASC,EAAqBC,EAAmD,CAC/E,IAAMC,EAAQ,IAAIC,EACdC,EAGEC,EAAkBC,EAAMC,EAAiB,CAC7C,WAAY,qBACZ,MAAO,qBACP,QAAS,CAAC,UAAU,EACpB,aAAc,CAAC,SAAS,CAC1B,CAAC,EAEKC,EAAiBF,EAAMC,EAAiB,CAC5C,WAAY,qBACZ,MAAO,oBACP,QAAS,CAAC,UAAU,EACpB,aAAc,CAAC,QAAQ,CACzB,CAAC,EAEKE,EAAeH,EAAMC,EAAiB,CAC1C,WAAY,qBACZ,MAAO,kBACP,QAAS,CAAC,UAAU,EACpB,aAAc,CAAC,MAAM,CACvB,CAAC,EAED,OAAAL,EAAM,IAAIA,GAASA,EAAM,OAAOM,EAAgBH,EAAiBI,CAAY,CAAC,EAE9ER,EAAM,UAAU,IAAM,CACpB,GAAM,CAAE,WAAAS,CAAW,EAAyCT,EAAM,SAAS,EAE3E,GAAI,OAAO,GAAGS,EAAYN,CAAc,EACtC,OAGF,IAAMO,EAAc,IAAI,IAAID,CAAU,EAChCE,EAAkB,IAAI,IAAIR,CAAc,EAGxCS,EAAkBF,EAAY,WAAWC,CAAe,EAE9DV,EAAM,IAAIA,GAAS,CACjB,QAAWY,KAAYD,EAAiB,CACtC,GAAM,CACJ,KAAM,CAAE,KAAAE,CAAK,CACf,EAAID,EAEEE,EAAUC,EAAuBH,CAAQ,EACzCI,EAAWC,EAAwBL,CAAQ,EAG3CM,EACJL,IAAS,MACL,CAAE,MAAOP,EAAe,KAAK,CAAE,EAC/BO,IAAS,OACP,CAAE,MAAON,EAAa,KAAK,CAAE,EAC7BM,IAAS,UACP,CAAE,MAAOV,EAAgB,KAAK,CAAE,EAChC,OAENS,EAAS,OAAS,WAAaA,EAAS,OAAS,SAEnDZ,EAAM,OAAO,CACX,WAAY,qBAEZ,MAAOc,EACP,QAAS,CAAC,UAAW,4CAA4C,EAEjE,eACE,eAAgBF,GAAYA,EAAS,aAAe,WAAa,aAAe,gBAIlF,WAAY,CACV,GAAIA,EAAS,GAAK,CAAC,iDAAiDA,EAAS,EAAE,EAAE,EAAI,CAAC,EACtF,GAAI,OAAOA,EAAS,YAAY,kBAAqB,SACjD,CAAC,4CAA4CA,EAAS,YAAY,gBAAgB,EAAE,EACpF,CAAC,CACP,EAEA,SAAAI,EACA,OAAAE,EACA,KAAO,SAAUN,GAAY,OAAOA,EAAS,MAAS,UAAYA,EAAS,MAAS,OAEpF,sDAAuD,CAAE,QAAS,QAAS,SAAUA,CAAS,EAC9F,kDAAmDA,EAAS,IAC9D,CAAC,EACQ,OAAOA,EAAS,MAAS,SAClCZ,EAAM,OAAO,CACX,WAAY,qBACZ,MAAOc,EACP,QAAS,OAAO,OAAO,CAAC,4CAA4C,CAAC,EACrE,WAAYF,EAAS,IAAM,iDAAiDA,EAAS,EAAE,GACvF,SAAAI,EACA,OAAAE,EACA,sDAAuD,CAAE,QAAS,QAAS,SAAUN,CAAS,EAC9F,kDAAmDA,EAAS,IAC9D,CAAC,EAED,QAAQ,KACN,uHACA,CAAE,SAAAA,CAAS,CACb,CAEJ,CACF,CAAC,EAEDV,EAAiBM,CACnB,CAAC,EAEMR,CACT,CAEA,IAAOmB,EAAQrB","names":["parse","createGraphFromStore","store","graph","da","prevActivities","channelAudience","parse","we","othersAudience","selfAudience","activities","activitySet","prevActivitySet","addedActivities","activity","role","localId","getLocalIdFromActivity","position","getPositionFromActivity","sender","createGraphFromStore_default"]}