Giter Site home page Giter Site logo

gautamsi / ews-javascript-api Goto Github PK

View Code? Open in Web Editor NEW
276.0 20.0 71.0 8.45 MB

EWS API for TypeScript/JavaScript - ported from OfficeDev/ews-managed-api - node, cordova, meteor, Ionic, Electron, Outlook Add-Ins

License: MIT License

TypeScript 99.34% CSS 0.01% HTML 0.04% JavaScript 0.33% PowerShell 0.29%
ews ews-api exchange-web-services meteor ionic3 cordova outlook-addin ionic

ews-javascript-api's Introduction

ews-javascript-api

Exchange Web Service in JavaScript/TypeScript.

Support

Contact @gautamsi for support. Use Gitter for 1:1 support and paid support. Also looking for sponsors to fund remaining development on this.

===========================================================================================

Office 365 OAuth Support is built in

see demo repo https://github.com/ewsjs/oauth-demo which has working example - https://github.com/ewsjs/oauth-demo/blob/main/examples/msal-node-samples/auth-code/index.js to find out how to use oAuth Token from msal.

March 2023 Update:

fixes and typing cleanups, see 0.12.0 below

July 2019 Update:

You can now use this in Ionic, Cordova, Browser based process (where CORS is disabled), Outlook Add-in or Mail apps. see ews-js-api-browser for more detail

(planning to rename this to @ewsjs/ewsjs);

Current State:

  • Almost all methods in ExchangeService class is comple with respect to c# counterpart (based on commit#31951f4
    • some method skipped as they are not for client side code or are diaognostic methods.
  • Roadmap to 1.0 Beta:
    • ReWrite XHR/Request and Promise see #94 done
    • Rewrite Autodiscover code with fresh Promise approach, this code was my work in very beginning and poorly written, strategy and TypeScript features improved over time which this code isn't taking any advantage of. done
    • use async/await and move to @ewsjs/* namespace
    • chain @ewsjs/xhr to wrap all exports from @ewsjs/ews
    • Add jsdoc comment to remaining exported class
  • Roadmap to 1.0
    • fix bugs from Beta
    • complete code improvement based on diff from original snapshot
    • basic tests to be introduced to prevent breaking changes
    • Add documentation with sample code for each operation in ExchangeService methods
    • Integrate ntlm and cookies authentication code in main library
  • Beyond 1.0
    • Add npm based typings support for lates TypeScript based workflow completed in 0.9.0
    • minified version for any developer need
    • String Null check to improve reliability, TypeScript 2.0 feature
    • Complete jsdoc comment in
    • Complete code for new features introduced after the snapshot I was working on
    • Add OAuth authentication with Azure AD (needs admin created APP in Azure AD)
    • Break into components to have better performance and download
    • enable non Node scenarios
    • trimmed version for Outlook Mail APP supported EWS calls

===========================================================================================

Whats new v0.15.0

  • Added helper class for Exchange Online/Office 365 OAuth with Exchange RBAC with Apps Support (This is latest Microsoft Guideline)
    • This RBAC method is APP only which uses Client Credential Flow and not user specific token
    • You can still get user specific access token by delegation and pass token to OAuthCredentials
  • updated @ewsjs/xhr version to 3.1.0 (dependency audit update)
import { ExchangeService, OAuthCredentials, ExchangeVersion } from "ews-javascript-api";
import { EwsOAuthHelper } from "ews-javascript-api/lib/EwsOAuthHelper";

const oAuthHelper = new EwsOAuthHelper({ clientId: '', clientSecret: '', tenantId: '' });
const token = await oAuthHelper.getAppAccessToken();
const ews = new ExchangeService(ExchangeVersion.);
ews.Credentials =new OAuthCredentials(token.accessToken);
await ews.<method>();

you will still need to update expired access token by calling oAuthHelper.getAppAccessToken(), you can safely run this when you want to use ews as this can return cached token which is not expired

Whats new v0.14.0

  • Updated implementation of @ewsjs/ntlm-client to continue support ntlm with node 18+ (dependency of @ewsjs/xhr)
  • This fixes latest support for ntlm with node 18/20+
  • This also fixes security warning of new Buffer(...) in the underlying library

Whats new v0.13.0 BREAKING CHANGES

  • Security update: removed fetch and bluebird dependency
  • removed XHRDefault and ConfigurationApi.ConfigurePromise exported methods
  • Exported XHRApi from @ewsjs/xhr to make it easier to use
  • Using default implementation of XhrApi from @ewsjs/xhr instead of using fetch

Whats new v0.12.0

  • fixed WellKnownFolderNames to be StringPropertyDefinition type instead of Generic which microsoft has changed long back. Part of this was fixed by #414 (thanks @klinki)
  • fixes #416 and also cleans up other typing issues
  • Security update: updated all dependency to latest version.

Whats new v0.11.0

  • BREAKING dependencies upgraded to latest version of commonjs module (still avoiding pure esm modules). The code is now compiled to es6 target, must use nodejs version >= 10
  • Security update: updated all dependency to latest version.

Whats new v0.10.0

  • new/fix: #324 Autodiscover is back again, improved and supports DNS fallback using Autodiscover SRV records

  • new: #320 Allow access to HttpResponseHeaders, you can use <ExchangeService Instance>.HttpResponseHeaders to get fresh header from last call to ews service.

    • you can also add a delegate (callback) for <ExchangeService Instance>.OnResponseHeadersCaptured which is called after each call to service and when headers are returned.
  • Breaking Changes: <ExchangeService>.HttpHeaders is now Disctionary instance, compatible with c# disctionary. you can no longer do service.HttpHeaders[<header>] = value. do this instead service.HttpHeaders.Add("header", "value");

  • fix: #322 you can now delete tasks properly

See older change in CHANGELOG.md

===========================================================================================

EWS managed API for TypeScript/JavaScript - code ported from OfficeDev/ews-managed-api. availbale for nodejs, browser and mobile devices (cordova).

Pluggable XHRApi adapter to replace client (browser) based XHR call with server brokered call (example coming soon). Example Ruby on rails, PHP or any server side framework where c# or nodejs is not available

Works with Office 365/Exchange Online and on-premises Exchange (2007 - 2016)

Authentication

use SSL for basic authentication
NTLM and Cookies Authentication works with nodejs only

NTLM issue with invalid tagName gibrish character is due to gzip encoding, see #334.

Solution use gzip: true in XhrApi({ gzip: true }) constructor options of @ewsjs/xhr.

Modules

  • commonjs module for NodeJs
  • AMD module for other scenarios* (not documented yet)

All http call is wrapped in promise using default BlueBird promise. You can also interchange compatible promise api. Code sample from EWS Managed API 2.1. should work with little modificaion to Promise format

async/await latest nodejs

You can also leverage new async/await feature of nodejs (>7.0.6) or in TypeScript transpilation with es5/es6 code.

Documentation

Api document generated using TypeDoc and is hosted at ews-javascript-api.github.io/api. ** outdated Check Wiki for more details

keep track of what is coming in backlog, keep eye on milestones when I start working on it

Getting Started

install

[sudo] npm install ews-javascript-api

use

//classic Javascript style
var ews = require('ews-javascript-api');
var exch = new ews.ExchangeService(ews.ExchangeVersion.Exchange2013);
//ES6 TypeScript style
import {ExchangeService, AutodiscoverService, Folder, Item, ExchangeVersion} from "ews-javascript-api";
var exch = new ExchangeService(ExchangeVersion.Exchange2013);

Autodiscover user settings (** Working again as of 0.10 **)

//import ews module
var ews = require('ews-javascript-api');
//create AutodiscoverService object
var autod = new ews.AutodiscoverService(new ews.Uri("https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc"), ews.ExchangeVersion.Exchange2010);
//you can omit url and it will autodiscover the url, version helps throw error on client side for unsupported operations.example - //var autod = new ews.AutodiscoverService(ews.ExchangeVersion.Exchange2010);
//set credential for service
autod.Credentials = new ews.WebCredentials("userName", "password");
//create array to include list of desired settings
var settings = [
ews.UserSettingName.InternalEwsUrl,
ews.UserSettingName.ExternalEwsUrl,
ews.UserSettingName.UserDisplayName,
ews.UserSettingName.UserDN,
ews.UserSettingName.EwsPartnerUrl,
ews.UserSettingName.DocumentSharingLocations,
ews.UserSettingName.MailboxDN,
ews.UserSettingName.ActiveDirectoryServer,
ews.UserSettingName.CasVersion,
ews.UserSettingName.ExternalWebClientUrls,
ews.UserSettingName.ExternalImap4Connections,
ews.UserSettingName.AlternateMailboxes
];
//get the setting
autod.GetUserSettings(["[email protected]", "[email protected]"], settings)
.then(function (response) {
    //do what you want with user settings    
    var tabcount = 0;
    var tabs = function () { return ews.StringHelper.Repeat("\t", tabcount); };
    console.log(autod.Url.ToString());
	//uncoment next line to see full response from autodiscover, you will need to add var util = require('util');
	//console.log(util.inspect(response, { showHidden: false, depth: null, colors: true }));
    for (var _i = 0, _a = response.Responses; _i < _a.length; _i++) {
        var resp = _a[_i];
        console.log(ews.StringHelper.Format("{0}settings for email: {1}", tabs(), resp.SmtpAddress));
        tabcount++;
        for (var setting in resp.Settings) {
            console.log(ews.StringHelper.Format("{0}{1} = {2}", tabs(), ews.UserSettingName[setting], resp.Settings[setting]));
        }
        tabcount--;
    }
}, function (e) {
    //log errors or do something with errors
});

Example EWS operations

Example of user availability

var ews = require('ews-javascript-api');
//create ExchangeService object
var exch = new ews.ExchangeService(ews.ExchangeVersion.Exchange2013);
exch.Credentials = new ews.WebCredentials("userName", "password");
//set ews endpoint url to use
exch.Url = new ews.Uri("https://outlook.office365.com/Ews/Exchange.asmx"); // you can also use exch.AutodiscoverUrl

var attendee =[ new ews.AttendeeInfo("[email protected]"), new ews.AttendeeInfo("[email protected]")];
//create timewindow object o request avaiability suggestions for next 48 hours, DateTime and TimeSpan object is created to mimic portion of .net datetime/timespan object using momentjs
var timeWindow = new ews.TimeWindow(ews.DateTime.Now, ews.DateTime.Now.AddDays(2)); 
exch.GetUserAvailability(attendee, timeWindow, ews.AvailabilityData.FreeBusyAndSuggestions)
.then(function (availabilityResponse) {
    //do what you want with user availability
}, function (errors) {
    //log errors or do something with errors
});
        

Use with React Native

there is some issues with how react native exposes native browser methods, here are changes needs to be done to us ews-js-api-browser with react native. Add following lines to some place before requiring ews-js-api-browser. you need to use @xmldom/xmldom and base-64 packages.

if (!global.DOMParser) {
    global.DOMParser = require('@xmldom/xmldom').DOMParser;
}
if (!global.atob || !global.btoa) {
    global.atob = require('base-64').decode;
    global.btoa = require('base-64').encode;
}

Porting status

Review Core/ExchangeService methods in api document, Any method not marked private oe internal (internal marker is in description of method) is posted and can be used, open issue if it doe snot work

List of ExchangeService methods available

ArchiveItems
AutodiscoverUrl
BindToGroupItems
BindToItems
ConvertId
ConvertIds
CopyItems
CreateItems
DeleteItems
ExpandGroup
FindAppointments
FindFolders
FindItems
GetAttachments
GetClientAccessToken
GetPasswordExpirationDate
GetRoomLists
GetRooms
GetUserAvailability
GetUserOofSettings
GetUserOofSettings
LoadPropertiesForItems
MarkAsJunk
MoveItems
ResolveName
SetTeamMailbox
SetUserOofSettings SetUserOofSettings
SubscribeToPullNotifications
SubscribeToStreamingNotifications
SubscribeToStreamingNotificationsOnAllFolders
SyncFolderHierarchy
SyncFolderItems
UnpinTeamMailbox
UpdateItems
GetInboxRules
UpdateInboxRules
AddDelegates
GetDelegates
RemoveDelegates
UpdateDelegates
GetUserRetentionPolicyTags
FindConversation
FindGroupConversation
GetConversationItems
GetGroupConversationItems
EnableAlwaysCategorizeItemsInConversations
DisableAlwaysCategorizeItemsInConversations
EnableAlwaysDeleteItemsInConversations
DisableAlwaysDeleteItemsInConversations
EnableAlwaysMoveItemsInConversations
DisableAlwaysMoveItemsInConversations
MoveItemsInConversations
CopyItemsInConversations
DeleteItemsInConversations
SetReadStateForItemsInConversations
SetRetentionPolicyForItemsInConversations
SetFlagStatusForItemsInConversations
GetAppManifests
GetAppMarketplaceUrl
DisableApp
InstallApp
UninstallApp
GetDiscoverySearchConfiguration
GetHoldOnMailboxes
GetNonIndexableItemDetails
GetNonIndexableItemStatistics
GetSearchableMailboxes
SearchMailboxes
SetHoldOnMailboxes

List of Folder object methods available

BindToFolder
CopyFolder
CreateFolder
DeleteFolder
EmptyFolder
FindFolders
FindItems
Load
LoadPropertiesForFolder
MarkAllItemsAsRead
MarkAllItemsAsUnread
RemoveExtendedProperty
SetExtendedProperty
MoveFolder
Save
UpdateFolder

List of Item object methods available

ArchiveItem
BindToItem
CopyItem[s]
CreateItem
DeleteItem[s]
FindAppointments
FindItems
LoadPropertiesForItems
MarkAsJunk
MoveItem
SendItem
Save
UpdateItem[s]
RemoveExtendedProperty
SetExtendedProperty
AcceptTentatively [Appointment]
AcceptTentatively [Appointment]
Decline [Appointment]

Use in Cordova

AMD module for require.js to be included in build system, bower module and related documentation will be published.

Tests

in progress....

License

Licensed under MIT

ews-javascript-api's People

Contributors

benyanke avatar bijection avatar craigmarvelley avatar dependabot[bot] avatar gautamsi avatar inkirby avatar klinki avatar liyinsg avatar marcoancona avatar marcusmotill avatar nicholas-l avatar snollygolly avatar thlee927 avatar tobiasviehweger avatar zmathew avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ews-javascript-api's Issues

Item.ts - SetSubject : Not implemented.

Hi,

First of all I want to say thanks for the great module. I have a little issue, I am getting the following error, Error: Item.ts - SetSubject : Not implemented, when trying to create a new appointment on the calendar. I looked a bit through the code and I saw that this feature is not yet implemented. Any ETA on when we can expect it?
I am trying to understand what I can do to implement this, in case you don't have time, but it seems fairly complex, any help or notes you might have?

The code in question:

  var appointment = new ews.Appointment(exch);
  appointment.Subject = "Dentist Appointment";
  appointment.Body = "The appointment is with Dr. Smith.";
  appointment.Start = new DateTime(2016, 3, 1, 9, 0, 0);
  appointment.End = appointment.Start.AddHours(2);
  appointment.Save(SendInvitationsMode.SendToNone);

Feature: AccountLockout detection

to track Implementation of ProcessHttpErrorResponse on ExchangeService which provides Account LockOut detection based on HTTP status code.

part of #28

Issues with Autodiscover

Trying to use the example you have here for autodiscovery and getting user settings however I am hitting a snag when it comes to the Autodiscovery itself.

I have the AutoDiscoverService set up as:

var autod = new ews.AutodiscoverService(ews.ExchangeVersion.Exchange2013);

I then do

autod.Credentials = new ews.ExchangeCredentials("testuser", "testpass", "mydomain");

I also change the autod.GetUserSettings() to have the correct email address in it, however when I run the code via node I get the following issue:

Determining which endpoints are enabled for host autodiscover.example.com Host returned enabled endpoint flags: Legacy,Soap,WsSecurity,OAuth --hard checking for office 365 with node.js http request and presence of header x-federationtrusttokenissueruri: urn:federation:MicrosoftOnline. All other redirection wil fail Trying to get Autodiscover redirection URL from http://autodiscover.example.com/autodiscover/autodiscover.xml. --Request error: 403, Forbidden

(Obviously changed the actual domain to example.com just for this issue)

There is no 'autodiscover' subdomain on my domain, it is 'mail', also, with Exchange 2016 it looks like (at least on my server) that it is: mail.example.com/Autodiscover/Autodiscover.xml (not the capital A).

readMe information is wrong

readMe does not show the correct npm install title.

Shows:
npm install ews-managed-api

Should show:
npm install ews-javascript-api

AutoDiscover: silently fails the script when one of the user is not found

for user mailbox not found in Exchange, it sends null for value of UserSettings filed. Error in script throws error when checking properties on null valued object.
#60 has reported this.

fixing in next release.

workaround:
change line 169 in "GetUserSettingsResponse.js" file of current release (0.4)
from

    GetUserSettingsResponse.prototype.LoadUserSettingsFromJson = function (obj) {
        var settings = undefined;
        if (typeof (obj[XmlElementNames_1.XmlElementNames.UserSetting]) === 'undefined')  //Line 169
            return;

to

    GetUserSettingsResponse.prototype.LoadUserSettingsFromJson = function (obj) {
        var settings = undefined;
        if (!obj || typeof (obj[XmlElementNames_1.XmlElementNames.UserSetting]) === 'undefined')
            return;

and line 155 in same file from

    GetUserSettingsResponse.prototype.LoadUserSettingErrorsFromJson = function (obj) {
        var errors = undefined;
        if (typeof (obj[XmlElementNames_1.XmlElementNames.UserSettingError]) === 'undefined') //Line 155
            return;

to

    GetUserSettingsResponse.prototype.LoadUserSettingErrorsFromJson = function (obj) {
        var errors = undefined;
        if (!obj || typeof (obj[XmlElementNames_1.XmlElementNames.UserSettingError]) === 'undefined')
            return;

Is StreamingSubscriptionConnection api working on NTLM auth?

this is my code -

var Streaming = new  ews.StreamingSubscriptionConnection(exch,1);

exch.SubscribeToStreamingNotificationsOnAllFolders([1]).then(function(responses){
    console.log('oo');
    Streaming.AddSubscription(responses);
    Streaming.OnNotificationEvent.push(function(){
        console.log('aa');
    });
    Streaming.Open();
},function(responses){
    console.log('xx');
}) 

but when event hapen
OnNotificationEvent not work

I use ntlmXHRApi to auth Streaming
maybe is ntlmXHRApi not support Streaming

have any way can make Streaming working on ntlmXHRApi?

Streaming Notications

Is it possible to have streaming notifications? would like to be able to subscribe to new mail notifications.

Typings for NPM Packages

Hello,

Looking at the Typescript documentation, it seems that your project lacks of an index.d.ts file or of a typings property in your package.json. See http://www.typescriptlang.org/docs/handbook/typings-for-npm-packages.html

When I try to set the typings with "typings": "./typings/ExchangeWebService.d.ts", I get this error

node_modules/ews-javascript-api/typings/ExchangeWebService.d.ts(11133,34): error TS2304: Cannot find name 'UpdateInboxRulesResponse'

Is it an issue or I'm doing that wrong ?

Thanks!

NTLM authentication

Hi,

(Think this is a feature request).

Was trying to use this framework which looks really nice, but discovered that the exchange server I am using is configured for NTLM authentication.

I used a nodejs package https://github.com/tcr/node-ntlm where the demonstration worked when I tried it by adding simple EWS SOAP xml to the body of the second request (after the challenge).

I tried to have a look at the code for the EWS to see if I could implement it, but became quite lost as my node skills aren't up there yet, and got as far as seeing that Basic authentication is used.

Thanks,
Jarrod

GetUserAvailability issue

I am trying to use the use the GetUserAvailability function, literally, just like your example and nothing else, i get success with the GetPasswordExpirationDate method but GetUserAvailability I just get an error:

ErrorTypeError: Cannot read property 'Validate' of null

Do you have any thought about it?

Thank you!

NTLM/ntlmXHR using impersonation

Hey, I'm trying to use impersonation to get users tasks in exchange.
Is it possible with this API?

This (https://gist.github.com/maccyber/a57e3b7f8ded3d72205c817cf4c5b377) code, gives:

Error: Id property must be set before serialization
    at ImpersonatedUserId.WriteToXml (/home/jonas/projects/ews-tasks-exchange/node_modules/ews-javascript-api/js/Misc/ImpersonatedUserId.js:16:19)
    at FindItemRequest.ServiceRequestBase.WriteToXml (/home/jonas/projects/ews-tasks-exchange/node_modules/ews-javascript-api/js/Core/Requests/ServiceRequestBase.js:402:45)
    at FindItemRequest.ServiceRequestBase.EmitRequest (/home/jonas/projects/ews-tasks-exchange/node_modules/ews-javascript-api/js/Core/Requests/ServiceRequestBase.js:102:18)
    at FindItemRequest.ServiceRequestBase.BuildXHR (/home/jonas/projects/ews-tasks-exchange/node_modules/ews-javascript-api/js/Core/Requests/ServiceRequestBase.js:73:14)
    at /home/jonas/projects/ews-tasks-exchange/node_modules/ews-javascript-api/js/Core/Requests/SimpleServiceRequestBase.js:41:33
    at new Promise (/home/jonas/projects/ews-tasks-exchange/node_modules/winjs-node/src/js/WinJS/Promise/_StateMachine.js:988:13)
    at WinJSPromiseApi.create (/home/jonas/projects/ews-tasks-exchange/node_modules/ews-javascript-api/js/Promise_WinJS.js:12:16)
    at Function.PromiseFactory.create (/home/jonas/projects/ews-tasks-exchange/node_modules/ews-javascript-api/js/PromiseFactory.js:32:30)
    at FindItemRequest.SimpleServiceRequestBase.InternalExecute (/home/jonas/projects/ews-tasks-exchange/node_modules/ews-javascript-api/js/Core/Requests/SimpleServiceRequestBase.js:40:48)
    at /home/jonas/projects/ews-tasks-exchange/node_modules/ews-javascript-api/js/Core/Requests/MultiResponseServiceRequest.js:36:19

Implement: Conversation operations

ExchangeService methods:

  • FindConversation
  • FindGroupConversation
  • GetConversationItems
  • GetGroupConversationItems
  • EnableAlwaysCategorizeItemsInConversations
  • DisableAlwaysCategorizeItemsInConversations
  • EnableAlwaysDeleteItemsInConversations
  • DisableAlwaysDeleteItemsInConversations
  • EnableAlwaysMoveItemsInConversations
  • DisableAlwaysMoveItemsInConversations
  • MoveItemsInConversations
  • CopyItemsInConversations
  • DeleteItemsInConversations
  • SetReadStateForItemsInConversations
  • SetRetentionPolicyForItemsInConversations
  • SetFlagStatusForItemsInConversations

Calendar Details always return objects busyType ="busy"

Hi,

First of all I want to say thanks for the great module.I am implementing outlook dashboard which lists out meeting rooms that are available and booked.When i make a call to "GetUserAvailability" which always returns Calendar Details that has only busyType="busy" . I think i am missing some thing or configuration is incorrect. Here is code I am using

var exch = new ews.ExchangeService(ews.ExchangeVersion.Exchange2010);
exch.Credentials = new ews.ExchangeCredentials("****", "**");
exch.Url = new ews.Uri("https://colarnexch02.test.com/ews/exchange.asmx");
var attendee = [new ews.AttendeeInfo("
*********************")];
var timeWindow = new ews.TimeWindow(ews.DateTime.Now, new ews.DateTime(ews.DateTime.Now.TotalMilliSeconds +ews.TimeSpan.FromHours(24).asMilliseconds()));

exch.GetUserAvailability(attendee, timeWindow, ews.AvailabilityData.FreeBusy)

This is output i get :

GetUserAvailabilityResponse:
{ FreeBusyResponseArray:
{ FreeBusyResponse:
{ ResponseMessage: { ResponseClass: 'Success', ResponseCode: 'NoError' },
FreeBusyView:
{ FreeBusyViewType: 'Detailed',
CalendarEventArray:
{ __type: 'CalendarEventArray',
CalendarEvent:
[ { __type: 'CalendarEvent',
StartTime: '2016-03-01T14:30:00',
EndTime: '2016-03-01T15:00:00',
BusyType: 'Busy',
CalendarEventDetails:
{ __type: 'CalendarEventDetails',
ID: '00000000AB34FCBB2DD5D5439F00576C34BC890F0700A7104A6AE99E604A9316B97E9A390B880000003168AF0000A7104A6AE99E604A9316B97E9A390B880000007B4ED50000',
Subject: 'Dave Adam',
Location: '***********************',
IsMeeting: 'true',
IsRecurring: 'true',
IsException: 'false',
IsReminderSet: 'false',
IsPrivate: 'false' } },

Thanks in Advance.

FindFolders not continue when ews return error

I'm trying to verify the existence of a mailbox using the function FindFolders.
My code is:

var folderid = new ews.FolderId(ews.WellKnownFolderName.Inbox, new ews.Mailbox("[email protected]"));
service.FindFolders(folderid, new ews.FolderView(10)).then(function(response) {
console.log("OK");
}, function(error) {
console.log("ERROR");
});
console.log("CONTINUE");

When the mailbox exists it works great but when the mailbox is not found, no console.log command is executed and the script doesn't continue.

EWS answers correctly this error:

Body:
{ __prefix: 's',
FindFolderResponse:
{ __prefix: 'm',
__type: 'FindFolderResponse',
ResponseMessages:
{ __prefix: 'm',
__type: 'ResponseMessages',
FindFolderResponseMessage:
{ __prefix: 'm',
__type: 'FindFolderResponseMessage',
ResponseClass: 'Error',
MessageText: 'The SMTP address has no mailbox associated with it.',
ResponseCode: 'ErrorNonExistentMailbox',
DescriptiveLinkKey: '0',
MessageXml:
{ __prefix: 'm',
__type: 'MessageXml',
Value:
{ __prefix: 't',
__type: 'Value',
Name: 'SmtpAddress',
Value: '[email protected]' } } } } } } }

can you help me? Excuse me for the countless requests and excuse me for my bad English

Best Regards

error code:0

Hello everyone,

I'm trying to connect to my exchange server (Azure VM + exchange server 2016 + but without autodiscover) with the following code:

`var ews = require('ews-javascript-api');
var exch = new ews.ExchangeService(ews.ExchangeVersion.Exchange2016);
exch.Credentials = new ews.ExchangeCredentials("domain\login", "password");
exch.Url = new ews.Uri("https://XXXXX.cloudapp.net/EWS/Exchange.asmx"); 

var attendee =[ new ews.AttendeeInfo("[email protected]")];
var timeWindow = new ews.TimeWindow(ews.DateTime.Now, new ews.DateTime(ews.DateTime.Now.TotalMilliSeconds + ews.TimeSpan.FromHours(48).asMilliseconds())); 
exch.GetUserAvailability(attendee, timeWindow, ews.AvailabilityData.FreeBusyAndSuggestions)
.then(function (availabilityResponse) {
  //do what you want with user availability
    console.log(availabilityResponse)
}, function (errors) {
  //log errors or do something with errors
    console.log(errors)
});`

The Ews request is the following :

`sending ews request
{ url: �[32m'https://XXXX.cloudapp.net/EWS/Exchange.asmx'�[39m,
  headers: 
   { �[32m'Content-Type'�[39m: �[32m'text/xml; charset=utf-8'�[39m,
     Accept: �[32m'text/xml'�[39m,
     Authorization: �[32m'Basic QkXXXXXXXXXXXXXXXXXXXXdXIwMQ=='�[39m },
  type: �[32m'POST'�[39m,
  data: �[32m'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><soap:Header><t:RequestServerVersion Version="Exchange2016"></t:RequestServerVersion><t:TimeZoneContext><t:TimeZoneDefinition Name="UTC" Id="UTC"></t:TimeZoneDefinition></t:TimeZoneContext></soap:Header><soap:Body><m:GetUserAvailabilityRequest><m:MailboxDataArray><t:MailboxData><t:Email><t:Address>[email protected]</t:Address></t:Email><t:AttendeeType>Required</t:AttendeeType><t:ExcludeConflicts>false</t:ExcludeConflicts></t:MailboxData></m:MailboxDataArray><t:FreeBusyViewOptions><t:TimeWindow><t:StartTime>2016-06-04T00:00:00</t:StartTime><t:EndTime>2016-06-06T00:00:00</t:EndTime></t:TimeWindow><t:MergedFreeBusyIntervalInMinutes>30</t:MergedFreeBusyIntervalInMinutes><t:RequestedView>Detailed</t:RequestedView></t:FreeBusyViewOptions><t:SuggestionsViewOptions><t:GoodThreshold>25</t:GoodThreshold><t:MaximumResultsByDay>10</t:MaximumResultsByDay><t:MaximumNonWorkHourResultsByDay>0</t:MaximumNonWorkHourResultsByDay><t:MeetingDurationInMinutes>60</t:MeetingDurationInMinutes><t:MinimumSuggestionQuality>Fair</t:MinimumSuggestionQuality><t:DetailedSuggestionsWindow><t:StartTime>2016-06-04T00:00:00</t:StartTime><t:EndTime>2016-06-06T00:00:00</t:EndTime></t:DetailedSuggestionsWindow></t:SuggestionsViewOptions></m:GetUserAvailabilityRequest></soap:Body></soap:Envelope>'�[39m }
`

And i got the following error :

Error in calling service, error code:0

Am I doing something wrong?? Or maybe the server is not configured properly??

Cheers,

Send attachments

Hello

is sending file attachment supported yet?

Also, my company is looking into extending OWA. I am wondering if you are interested in working together. If you are, please contact me at [email protected]

Thanks

error 401

I'm not sure what the issue is, but I get a 401 error when I call GetUserAvailability (I didn't use the autodiscover function). Could this be a problem with authentication on the server side?
Here is the code:

var ews = require('ews-javascript-api');

var exch = new ews.ExchangeService(ews.ExchangeVersion.Exchange2010);
exch.Credentials = new ews.ExchangeCredentials("xxxxx", "xxxxxxxx", "webmail.xxxx.be");
exch.Url = new ews.Uri("https://webmail.xxxx.be/Ews/Exchange.asmx");

var attendee =[new ews.AttendeeInfo("[email protected]")];
var timeWindow = new ews.TimeWindow(ews.DateTime.Now, new ews.DateTime(ews.DateTime.Now.TotalMilliSeconds + ews.TimeSpan.FromHours(48).asMilliseconds()));

exch.GetUserAvailability(attendee, timeWindow, ews.AvailabilityData.FreeBusyAndSuggestions).then(function (availabilityResponse) {
    console.log("succes");
  }, function (errors) {
    console.log(errors);
  });

and here is the error:

[ServiceObjectPropertyDefinition.ctor] uri is null or empty
[ServiceObjectPropertyDefinition.ctor] uri is null or empty
[ServiceObjectPropertyDefinition.ctor] uri is null or empty
[ServiceObjectPropertyDefinition.ctor] uri is null or empty
sending ews request
{ url: 'https://webmail.xxxx.be/Ews/Exchange.asmx',
  headers: 
   { 'Content-Type': 'text/xml; charset=utf-8',
     Accept: 'text/xml',
     Authorization: 'Basic dmVya2xxxxxxxxxxXXvMQ==' },
  type: 'POST',
  data: '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><soap:Header><t:RequestServerVersion xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2010"></t:RequestServerVersion><t:TimeZoneContext xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><t:TimeZoneDefinition xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Name="UTC" Id="UTC"></t:TimeZoneDefinition></t:TimeZoneContext></soap:Header><soap:Body><m:GetUserAvailabilityRequest xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"><m:MailboxDataArray xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"><t:MailboxData xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><t:Email xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><t:Address xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">[email protected]</t:Address></t:Email><t:AttendeeType xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">Required</t:AttendeeType><t:ExcludeConflicts xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">false</t:ExcludeConflicts></t:MailboxData></m:MailboxDataArray><t:FreeBusyViewOptions xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><t:TimeWindow xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><t:StartTime xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">2016-03-14T00:00:00</t:StartTime><t:EndTime xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">2016-03-16T00:00:00</t:EndTime></t:TimeWindow><t:MergedFreeBusyIntervalInMinutes xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">30</t:MergedFreeBusyIntervalInMinutes><t:RequestedView xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">Detailed</t:RequestedView></t:FreeBusyViewOptions><t:SuggestionsViewOptions xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><t:GoodThreshold xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">25</t:GoodThreshold><t:MaximumResultsByDay xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">10</t:MaximumResultsByDay><t:MaximumNonWorkHourResultsByDay xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">0</t:MaximumNonWorkHourResultsByDay><t:MeetingDurationInMinutes xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">60</t:MeetingDurationInMinutes><t:MinimumSuggestionQuality xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">Fair</t:MinimumSuggestionQuality><t:DetailedSuggestionsWindow xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"><t:StartTime xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">2016-03-14T00:00:00</t:StartTime><t:EndTime xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">2016-03-16T00:00:00</t:EndTime></t:DetailedSuggestionsWindow></t:SuggestionsViewOptions></m:GetUserAvailabilityRequest></soap:Body></soap:Envelope>' }
Error in calling service, error code:401

Fetch Contacts and Create Meetings not implemented

Hi Gautam,

I am trying to fetch contact but I did not find any method to achieve this. I think its not yet implemented. Also, for creating new meeting using Appointment.Save I am not able to add RequiredAttendees & OptionalAttendees. Is there any other way to create new meeting? If not then Any plans to implement both these functionalities?

Problem Import eml into Exchange 2013

When I try to import an .eml file I get the following error:
[xmldom error] element parse error: Error: invalid tagName:[email protected]
@#[line:6,col:14]
[xmldom error] element parse error: Error: invalid tagName:[email protected]
@#[line:13,col:6]
[xmldom error] element parse error: Error: invalid tagName:[email protected]
@#[line:19,col:33]
[xmldom error] element parse error: Error: invalid tagName:[email protected]
@#[line:25,col:6]
[xmldom error] element parse error: Error: invalid tagName:[email protected]
@#[line:27,col:13]
[xmldom error] element parse error: Error: invalid tagName:CAJGmDoE-Uc8LfFrVg8ryuOu95kzH4TVSMPSkr+hvpL_9sObJ7w@mail.domain.com
@#[line:54,col:13]
[xmldom error] element parse error: Error: invalid tagName:[email protected]
@#[line:56,col:22]
[xmldom error] element parse error: Error: invalid tagName:[email protected]
@#[line:57,col:32]
[xmldom warning] unclosed xml attribute
@#[line:64,col:23]

My js code is:
fs.open("/tmp/test.eml",'r', function(err, fd) {
fs.stat("/tmp/test.eml", function(err, stats)
{

var bufferSize=stats.size,
  chunkSize=512,
  buffer=new Buffer(bufferSize),
  bytesRead = 0;

while (bytesRead < bufferSize)
{
  if ((bytesRead + chunkSize) > bufferSize)
  {
    chunkSize = (bufferSize - bytesRead);
  }
  fs.read(fd, buffer, bytesRead, chunkSize, bytesRead);
  bytesRead += chunkSize;
}

var email = new ews.EmailMessage(exch);
email.MimeContent = new ews.MimeContent("UTF-8", buffer);
var PR_MESSAGE_FLAGS_msgflag_read = new ews.ExtendedPropertyDefinition(3591, ews.MapiPropertyType.Integer);
email.SetExtendedProperty(PR_MESSAGE_FLAGS_msgflag_read, 1);
email.Save(ews.WellKnownFolderName.Inbox);
console.log(buffer.toString('utf8', 0, bufferSize));
fs.close(fd);

});
});

Can someone help me?
Best Regards
Giovanni

Cookies Authentication behind TMG - Error when calling GetUserAvailability method

Hello, First thank you for this module,
I'm trying to call GetUserAvailability from meteorjs application (the code is same like in readme file).

I'm getting the following error:

I20151014-18:57:28.056(2)? [ServiceObjectPropertyDefinition.ctor] uri is null or empty
I20151014-18:57:29.245(2)? [ServiceObjectPropertyDefinition.ctor] uri is null or empty
I20151014-18:57:29.246(2)? [ServiceObjectPropertyDefinition.ctor] uri is null or empty
I20151014-18:57:29.247(2)? [ServiceObjectPropertyDefinition.ctor] uri is null or empty
I20151014-18:57:29.247(2)? sending ews request
I20151014-18:57:29.247(2)? { url: 'https://mail.xxxx.com/EWS/Exchange.asmx',
I20151014-18:57:29.247(2)? headers:
I20151014-18:57:29.247(2)? { 'Content-Type': 'text/xml; charset=utf-8',
I20151014-18:57:29.248(2)? Accept: 'text/xml',
I20151014-18:57:29.248(2)? Authorization: 'Basic aWd1aXNzb3VtYTpA==' },
I20151014-18:57:29.248(2)? type: 'POST',
I20151014-18:57:29.248(2)? data: '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="h
ttp://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">soap:Header<t:RequestServerVersion Vers
ion="Exchange2010">/t:RequestServerVersion<t:TimeZoneContext><t:TimeZoneDefinition Name="UTC" Id="UTC">/t:TimeZoneDefinition/t:TimeZoneContext/soap:Header<soap:Bo
dy><m:GetUserAvailabilityRequest><m:MailboxDataArray><t:MailboxData><t:Email><t:Address>[email protected]/t:Address/t:Email<t:AttendeeType>Required</t:AttendeeTy
pe><t:ExcludeConflicts>false/t:ExcludeConflicts/t:MailboxData/m:MailboxDataArray<t:FreeBusyViewOptions><t:TimeWindow><t:StartTime>2015-10-14T00:00:00/t:StartTime<
t:EndTime>2015-10-16T00:00:00/t:EndTime/t:TimeWindow<t:MergedFreeBusyIntervalInMinutes>30/t:MergedFreeBusyIntervalInMinutes<t:RequestedView>Detailed</t:RequestedVie
w>/t:FreeBusyViewOptions/m:GetUserAvailabilityRequest/soap:Body/soap:Envelope' }
I20151014-18:57:29.287(2)? Error in calling service, error code:0
I20151014-18:57:29.287(2)? -----------error
I20151014-18:57:29.288(2)? null

When I tied the SoapRequest with another tool I get the followin error:

a:ErrorMissingArgumentYou must specify TimeZone.5028/m:ErrorCode/s:Fault/s:Body/s:Envelope

To fix the request soap I have to add like this:

        <t:TimeZone>
            <t:Bias>0</t:Bias>
            <t:StandardTime>
                <t:Bias>0</t:Bias>
                <t:Time>02:00:00</t:Time>
                <t:DayOrder>1</t:DayOrder>
                <t:Month>3</t:Month>
                <t:DayOfWeek>Sunday</t:DayOfWeek>
            </t:StandardTime>
            <t:DaylightTime>
                <t:Bias>0</t:Bias>
                <t:Time>02:00:00</t:Time>
                <t:DayOrder>1</t:DayOrder>
                <t:Month>10</t:Month>
                <t:DayOfWeek>Sunday</t:DayOfWeek>
            </t:DaylightTime>
        </t:TimeZone>

Do you have any idea how to fix this issue.
thx in advance.

Work in progress, help/suggestion wanted

I have made progress on many items but did not have time to document them. most updates are in dev branch with version pushed out to npm. I am also working on another app (gautamsi/MailboxApp.js - based on electron by @atom) which would showcase what is possible with ews-javascript-api. very slow progress though.

Please feel free to guide me for better documentation strategy (API docs generation etc.).

I have started adding jsdoc comment to new files by copying them from original ews-managed-api source file. Most function signature is same hence it is easier in using them directly. Original c# code has xml comment, I have used xmltojsdoc by @patik. I did modify his demo page at http://patik.github.io/xmltojsdoc/ to http://gautamsi.github.io/xmltojsdoc/indexAuto.html, benefit? added macro to perform paste, convert and then copy to clipboard so that workflow is like

  1. copy xml doc in visual studio (or any editor)
  2. switch to my indexAuto.html
  3. paste in ts file

now I am looking to build API pages any suggestion to generate .md page based on jsdoc comments? I can then modify samples in the page for everyone to use.

any takers for MailboxApp.js frontend? meaning if you can help with creating a nice GUI (ref github.com/nylas/N1), I can plugin ews-javascript-api to talk to Exchange/Office365. If anyone can help with an n1 plugin modal where data can be stored locally in sqlite, (no sync-server needed), this repo can be used to sync,update mailbox using EWS (only for Exchange/O365 mailboxes).

FindItems with SearchFilter and Extended Property

I'm trying to use ews.IsEqualTo as a search filter for a specific message header, with a property definition like this:
new ews.ExtendedPropertyDefinition(ews.DefaultExtendedPropertySet.InternetHeaders, 'header-name', ews.MapiPropertyType.String)

When I try to use any filter with FindItems(), I get the following error:
[Error: SearchFilter.ts - WriteToXml : Not implemented.]

Bit confusing given that it says here there are some available filters:

* @param {searchFilter} searchFilter The search filter. Available search filter classes include SearchFilter.IsEqualTo, SearchFilter.ContainsSubstring and SearchFilter.SearchFilterCollection

Am I doing something wrong? Or can nothing happen until SearchFilter.WriteToXml() is implemented?

ReferenceError: Reflect is not defined

Hi,

I am using Nodejs v5.9.1 and ews-javascript-api and getting error

ReferenceError: Reflect is not defined

while executing var ews = require('ews-javascript-api'); code.

I have attached screen shot of the issue. Any help would be highly appreciated.

Thanks,
Alka Saini
error

Using require('ews-javascript-api') throws "Error: Cannot find module '../Extensionmethods'"

Using Node v4.4.0, the "require" statement throws this error. You can also see this on the npm package site.

Full output:

vagrant@vagrant-ubuntu-trusty-64:~/test$ node app.js 
module.js:327
    throw err;
    ^

Error: Cannot find module '../Extensionmethods'
    at Function.Module._resolveFilename (module.js:325:15)
    at Function.Module._load (module.js:276:25)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/home/vagrant/test/node_modules/ews-javascript-api/js/PropertyDefinitions/PropertyDefinitionBase.js:6:26)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)

ConversationIndex Inaccessible in 2007

See these two stackoverflow posts:
http://stackoverflow.com/questions/24490464/conversationid-property-vs-conversationindex-property-in-exchange-web-services-m
http://stackoverflow.com/questions/7487570/implementing-outlook-2010s-group-by-conversation-using-ews-and-exchange-2007

Try this in the console:

> new ews.ExtendedPropertyDefinition(ews.EmailMessageSchema.ConversationIndex, ews.MapiPropertyType.Binary)
[ByteArrayPropertyDefinition.Parse] ByteArrayPropertyDefinition needs to be improved
Error: ByteArrayPropertyDefinition: incorrect call of ToString(value): value is undefined
    at ByteArrayPropertyDefinition.ToString (/Users/demi/git/ecma/switchedon/sync/node_modules/ews-javascript-api/js/PropertyDefinitions/ByteArrayPropertyDefinition.js:64:15)
    at ByteArrayPropertyDefinition.TypedPropertyDefinition.toString (/Users/demi/git/ecma/switchedon/sync/node_modules/ews-javascript-api/js/PropertyDefinitions/TypedPropertyDefinition.js:68:21)
    at new ExtendedPropertyDefinition (/Users/demi/git/ecma/switchedon/sync/node_modules/ews-javascript-api/js/PropertyDefinitions/ExtendedPropertyDefinition.js:32:21)

Fetching calendar items not implemented?

Hello,

I am trying to fetch calendar appointments using FindAppointments (or FindItems) method.
It looks like CalendarView has no implementations for required xml serialization methods yet, so this doesn't work.

Is there another way to search for meetings by date range?
If not, could you please give a hint on proper implementation of CalendarView's required methods (I am new to TypeScript and EWS)?

Implement: eDiscovery/Compliance operations

ExchangeService methods:

  • GetDiscoverySearchConfiguration
  • GetSearchableMailboxes
  • SearchMailboxes
  • SetHoldOnMailboxes
  • GetHoldOnMailboxes
  • GetNonIndexableItemDetails
  • GetNonIndexableItemStatistics

Autodiscover http 302/redirect check must not provide credential to avoid any credential leak over unsecure http

Autodiscover uses heuristics to connect to https://autodiscover.domain.com/autodiscover/autodiscover.xml or .svc. and then https://domain.com/autodiscover/autodiscover.xml or .svc

if these two call fail, it fail backs to http://autodiscover.domain.com/autodiscover/autodiscover.xml to check 302 redirect. (current issue in node v8 engine as well as browser XHR that it redirects automatically, the call fail in any case)
this lib does try to authenticate with O365 in case 302 redirect fail and some specific header present in http response.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.